构造函数中的 Qt 连接未连接?

Qt connect in constructor not connecting?

A google 搜索给出了前三个结果:

根据这些,它似乎应该 "just work" 像其他任何东西一样。但是这段代码没有:

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->reorderDelete 的原因是要在 Processing 的线程而不是 UI 的线程中完成。我希望我没有删除太多细节来说明问题;这是一个相当大的项目。

当我点击我的删除按钮时,我点击了 breakpoint 1(到目前为止,还不错),但我没有点击 breakpoint 2。我的其他 signals/slots 跨线程工作,但它们的 connects 不在构造函数中。我想让这个自动执行,这样每个实例都是 "just connected" 而不必记住这样做。我不能那样做吗?

好的,我知道了。留给别人找。


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

它也可以在 connect 之前的某处调用 qRegisterMetaType<ListType>("ListType");。 (我把它放在我的主要 window 的构造函数中。)这使数据类型已知,以便连接可以正常工作。

我现在已经达到了两个断点。

确保您在 class

中使用了 Q_OBJECT 宏