Qt Multi-Thread Queued Connection Signal / Slot Issue (SLOT does not trigger)

284 views Asked by At

Struggling emitting a signal from main/QML thread to another thread with a QList< QStringList > parameter. Variations I'v tried:

  • Q_DECLARATIVE_METATYPE in and out
  • Using EventExport vs. const EventExport& in signal and slot profiles
  • Sending empty EventExport in prepareExport() so emit has no/low data amount
  • Checking connect statement (always returns true)
  • Having qDebug() in prepareExport() and signal always appears to be emitted
  • Calling emit right after connect as a test (Works! Think you're going to tell me the main thread or cryoUtility objects don't exist but they do!)
  • Tried qRegisterMetaType with () and ("EventExport")...some say use text for typedef types

Any thoughts much appreciated!


sqlquery_model.h (not certain I need Q_DECLARATIVE_METATYPE but tried with and without...no change)

    typedef QList<QStringList> EventExport;
    Q_DECLARE_METATYPE(EventExport);
    Q_INVOKABLE void prepareExport();

signals:
    void updateEventListDataSig(const EventExport&);

sqlquery_model.cpp (this is connected to a qml page using TableView model...this emit does not seem to work)

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 (includes sqlquery_model.h, need this as cryoUtility is a separate thread using Qt::QueuedConnection)

// Use string if using typedef method
qRegisterMetaType<EventExport>("EventExport");

mediator.h

void updateEventListDataSig(const EventExport&);

mediator.cpp (connects mainly live here, this test event works)

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 (this is the slot, trigger once on test call)

void Utilities::updateEventListData(const EventExport& el) {
    qDebug() << "Load event list: ";// << el.count();
    //eventList = el;
}
1

There are 1 answers

0
Rich Bair On

So, after more study, sqlmodelquery connection would have to occur in its constructor as it isn't active yet until its QML page loads.