构造函数中的 Qt 连接未连接?
Qt connect in constructor not connecting?
A google 搜索给出了前三个结果:
- Qt can I connect signals/slots to self in constructor?
- QT Connect Signal Slot and initialize in constructor
根据这些,它似乎应该 "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 宏
A google 搜索给出了前三个结果:
- Qt can I connect signals/slots to self in constructor?
- QT Connect Signal Slot and initialize in constructor
根据这些,它似乎应该 "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 宏