Заполнение qtablewidget runtime

370
07 сентября 2017, 18:46

Есть проект, в нем обрабатывает внешняя библиотека, у которой есть функции обратного вызова. Когда происходит событие функция обратного вызова возвращает данные, эти данные передаются в другую функцию, а от туда через emit отправляются в слот для добавления этих данных в qtablewidget. Данные передаются по цепи, но в таблицу не заносятся. в чем может быть проблема?

P.S.: если что нибудь добавить в таблицу по нажатию кнопки, то все ок - передача сигнала

void sig_slot::some_func(int x, int y, char *z) //статическая функция для обратного вызова
{
    qDebug()<<"some_func"<<x<<y<<z; //показывает что получены данные
sig_slot *pmw=new sig_slot; 
pmw->get_table(z,y,z);//передаем
}
void sig_slot::get_table(int x, int y, char *z)
{
emit send_test(x, y, z); //слот
}

Заполнение таблицы:

void sig_slot::send_test( int x, int y, char *z)
{
QDateTime dt = QDateTime::currentDateTime();
int row = tableWidget->rowCount();
      tableWidget->insertRow(row);
      tableWidget->setColumnCount(4);
      QTableWidgetItem* item_dt = new QTableWidgetItem { dt.toString("dd.MM.yy hh.mm.ss") };
      item_dt->setBackground(Qt::red);
      tableWidget->setItem(row, 0, item_dt);

      QTableWidgetItem* item_ch = new QTableWidgetItem { QString::number(x)};
      item_ch->setBackground(Qt::green);
     tableWidget->setItem(row, 1, item_ch);
      QTableWidgetItem* item_wt = new QTableWidgetItem { QString::number(y)};
      item_wt->setBackground(Qt::red);
      tableWidget->setItem(row, 2, item_wt);
      QTableWidgetItem*item_pn = new QTableWidgetItem {QString::fromLocal8Bit(z)};
      item_pn->setBackground(Qt::green);
      tableWidget->setItem(row, 3, item_pn);
      qDebug()<<"func"<<x<<y<<z; //показывает что данные были переданы
}

А так все работает:

connect(button, &QPushButton::clicked, this, &sig_slot::t_table);
void sig_slot::t_table()
{
QDateTime dt = QDateTime::currentDateTime();
int row = tableWidget->rowCount();
      tableWidget->insertRow(row);
      tableWidget->setColumnCount(4);
      QTableWidgetItem* item_dt = new QTableWidgetItem { dt.toString("dd.MM.yy hh.mm.ss") };
      item_dt->setBackground(Qt::red);
      tableWidget->setItem(row, 0, item_dt);s.
      QTableWidgetItem* item_ch = new QTableWidgetItem { "test2"};
      item_ch->setBackground(Qt::green);
     tableWidget->setItem(row, 1, item_ch);
      QTableWidgetItem* item_wt = new QTableWidgetItem { "test2"};
      item_wt->setBackground(Qt::red);
      tableWidget->setItem(row, 2, item_wt);
      QTableWidgetItem*item_pn = new QTableWidgetItem {"test2"};
      item_pn->setBackground(Qt::green);
      tableWidget->setItem(row, 3, item_pn);
}
Answer 1

Send_test можно вызвать напрямую из get_table. Если же вы хотите использовать механизм сигналов, то эмитировать надо сигнал, а слот должен быть к нему подключён с помощью connect. Правда, непонятно зачем это надо внутри одного объекта

Answer 2
sig_slot *pmw=new sig_slot; 
pmw->get_table(z,y,z);//передаем

В этом месте вы создали новый объект sig_slot и для него вызываете функцию get_table, только к этому объекту не подключен никакой обработчик через connect.

Вам в этой функции не нужно создавать новый объект, а нужно получить доступ к уже созданному и для него вызывать get_table, как это сделать: через глобальную, статическую переменную, это уже другой вопрос.

void sig_slot::some_func(int x, int y, char *z) //статическая функция для 
обратного вызова
{
    qDebug()<<"some_func"<<x<<y<<z; //показывает что получены данные
    sig_slot *pmw=new sig_slot; 
    pmw->get_table(z,y,z);//передаем
}
Answer 3

в общем чтобы все заработало нужно делать глобальную переменную sig_slot* globalObject; в main.cpp и инициализируешь её там же. Далее, в файле реализации в самом начале ставить строчку extern sig_slot* globalObject;

READ ALSO
Получение температуры процессора C++ WMI Qt

Получение температуры процессора C++ WMI Qt

На строке hr = pEnum->Next(WBEM_INFINITE, 1, &pObject, &returned); выкидывает ошибку IDispatch error #3587, почему это происходит и как это можно исправить?

510
C++ Антивирусник не дает скачивать файлы

C++ Антивирусник не дает скачивать файлы

Имеется программа которая просто скачивает файл и записывает на рабочий стол, все хорошо программа скачивает, но вот в чем проблема антивирусник...

331
Что надо чтобы написать функцию прямого обращения к мыше или клавиатуре?

Что надо чтобы написать функцию прямого обращения к мыше или клавиатуре?

Ситуация такая есть у меня библиотека-кликер и я хочу написать несколько функций которые бы работали не через winapi эмулируя клавиатуру, мышь...

276
Узнать наличие текста на изображении

Узнать наличие текста на изображении

Есть массив изображенийНужно выделить изображения содержащие текст

201