【问题标题】:Qt Multi-Thread Queued Connection Signal / Slot Issue (SLOT does not trigger)Qt Multi-Thread Queued Connection Signal / Slot 问题(SLOT 不触发)
【发布时间】:2020-04-28 01:01:39
【问题描述】:

使用 QList 参数将信号从主/QML 线程发送到另一个线程。我尝试过的变体:

  • Q_DECLARATIVE_METATYPE 进出
  • 在信号和槽配置文件中使用 EventExport 与 const EventExport&
  • 在 prepareExport() 中发送空的 EventExport,因此 emit 没有/低数据量
  • 检查连接语句(始终返回 true)
  • 在 prepareExport() 中有 qDebug() 并且信号似乎总是被发出
  • 在连接后立即调用 emit 作为测试(有效!你会告诉我主线程或 cryoUtility 对象不存在,但它们确实存在!)
  • 尝试使用 () 和 ("EventExport") 的 qRegisterMetaType...有人说对 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(这是使用 TableView 模型连接到一个 qml 页面...这个发射似乎不起作用)

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;
}

【问题讨论】:

  • 从您的代码中删除所有 const 和 reference 限定符,然后重试。您也可以省略连接调用中的参数,因为方法签名是相同的。虽然我猜问题出在你创建线程的方式上,但也许它只是没有运行事件循环。

标签: qt queued-connection


【解决方案1】:

因此,经过更多研究,sqlmodelquery 连接必须在其构造函数中发生,因为它在其 QML 页面加载之前尚未激活。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多