Проблема с сигналом / слотом многопоточного соединения в очереди 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.

Другие вопросы по тегам