Проблема с сигналом / слотом многопоточного соединения в очереди Qt (SLOT не запускается)
Проблемы с передачей сигнала из основного /QML-потока другому потоку с параметром QList
- Q_DECLARATIVE_METATYPE на входе и выходе
- Использование EventExport и const EventExport& в профилях сигналов и слотов
- Отправка пустого EventExport в prepareExport(), поэтому у emit нет / мало данных
- Проверка оператора подключения (всегда возвращает истину)
- Наличие qDebug() в prepareExport() и сигнал всегда, кажется, испускается
- Вызов emit сразу после подключения в качестве теста (работает! Думаю, вы собираетесь сказать мне, что основной поток или объекты cryoUtility не существуют, но они есть!)
- Пробовал qRegisterMetaType с () и ("EventExport")... некоторые говорят, что используют текст для типов typedef
Любые мысли очень ценятся!
sqlquery_model.h (не уверен, что мне нужен Q_DECLARATIVE_METATYPE, но пробовал с и без... без изменений)
typedef QList<QStringList> EventExport;
Q_DECLARE_METATYPE(EventExport);
Q_INVOKABLE void prepareExport();
signals:
void updateEventListDataSig(const EventExport&);
sqlquery_model.cpp (это связано с qml-страницей с использованием модели TableView... похоже, что этот выброс не работает)
void SqlQueryModel::prepareExport() {
if (this->rowCount() > 0) {
EventExport eventsList;
for(int i=0; i<this->rowCount(); ++i) {
QStringList eventInfo;
eventInfo.append(this->record().value(0).toString());
eventInfo.append(this->record().value(1).toString());
eventInfo.append(this->record().value(2).toString());
eventInfo.append(this->record().value(3).toString());
eventInfo.append(this->record().value(4).toString());
eventsList.append(eventInfo);
}
emit updateEventListDataSig(eventsList);
qDebug() << "Emit updatedEventListData" << eventsList.count();
}
}
main.cpp (включает sqlquery_model.h, это необходимо, поскольку cryoUtility - это отдельный поток, использующий Qt::QueuedConnection)
// Use string if using typedef method
qRegisterMetaType<EventExport>("EventExport");
mediator.h
void updateEventListDataSig(const EventExport&);
mediator.cpp (подключается в основном здесь в прямом эфире, это тестовое событие работает)
bool ret = connect(this, SIGNAL(updateEventListDataSig(const EventExport&)), cryoUtility, SLOT(updateEventListData(const EventExport&)), Qt::QueuedConnection);
EventExport ed;
emit updateEventListDataSig(ed);
qDebug() << "Event list CONN: " << ret;
utilities.h
void updateEventListData(const EventExport&);
utilities.cpp (это слот, запускается один раз при тестовом вызове)
void Utilities::updateEventListData(const EventExport& el) {
qDebug() << "Load event list: ";// << el.count();
//eventList = el;
}
1 ответ
Итак, после дополнительного изучения соединение sqlmodelquery должно было произойти в его конструкторе, поскольку оно еще не активно, пока не загрузится его страница QML.