【问题标题】:Qt connect in constructor not connecting?构造函数中的Qt连接未连接?
【发布时间】:2017-09-15 23:57:34
【问题描述】:

谷歌搜索将这些作为前三个结果:

根据这些,它似乎应该像其他任何东西一样“正常工作”。但是这段代码没有:

EditorList::EditorList(..., QWidget* parent) :
    QWidget(parent)
{
    ...
    Processing* processing = Processing::getInstance();
    connect(this, SIGNAL(reorderDelete(DataSequence*,ListType,QList<int>)), processing, SLOT(reorderDelete(DataSequence*,ListType,QList<int>)));
    ...
    buttonDelete = new QPushButton(this);
    connect(buttonDelete, SIGNAL(clicked(bool)), this, SLOT(buttonDeleteClick()));
    ...
}
...
void EditorList::buttonDeleteClick()
{
    ...
    QList<int> locations;
    ...
    emit reorderDelete(mySequence, myListType, locations);    //breakpoint 1 here
}

//-----------------------------------------------------------------

void Processing::reorderDelete(DataSequence* sequence, ListType listType, QList<int> locations)
{
    if(sequence)    //breakpoint 2 here
    {
        sequence->reorderDelete(listType, locations);
    }
}

这种结构的原因,而不是直接调用mySequence-&gt;reorderDelete,是让它在Processing 的线程而不是UI 的线程中完成。我希望我没有删除太多细节来显示问题;这是一个相当大的项目。

当我点击删除按钮时,我点击了breakpoint 1(到目前为止,一切都很好),但我没有点击breakpoint 2。我的其他信号/插槽跨线程工作,但它们的connects 不在构造函数中。我想让这个自动化,这样每个实例都“刚刚连接”,而不必记住这样做。我不能那样做吗?

【问题讨论】:

    标签: c++ multithreading qt signals-slots


    【解决方案1】:

    好的,我明白了。留给别人找。


    According to this,我的ListType 枚举阻止了系统建立连接。它仅适用于系统已知的数据类型,因为发出 SIGNAL 实际上存储了一个副本供 SLOT(s) 稍后读取。我知道这一点,但我认为它更像是一个可以容纳任何东西的堆栈框架。显然不是。

    connect 之前的某个地方调用qRegisterMetaType&lt;ListType&gt;("ListType"); 也可以。 (我把它放在我的主窗口的构造函数中。)这使得数据类型已知,以便连接可以正常工作。

    我现在正在打两个断点。

    【讨论】:

    • 这很好,我只是想建议对代码进行更改,这将旨在为异步目的创建一些管道。我在通过信号发射传递复杂的数据结构时遇到了同样的问题,因此避免它是解决方案之一.. + for qRegisterMetaType&lt;ListType&gt;("ListType"); 解决方案。
    • @Guillotine ...aim creating some pipe for asynchronous purposes 对我来说有点难以理解。您的意思是将对象的显式副本留在其他地方而不是通过连接发送?我可以看到在某些情况下这是一个优势,或者如果我不需要那个确切时间的快照,我可以传递一个指针。
    【解决方案2】:

    确保您在课堂上使用了 Q_OBJECT 宏

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-30
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      相关资源
      最近更新 更多