【发布时间】:2017-09-15 23:57:34
【问题描述】:
谷歌搜索将这些作为前三个结果:
- Qt: Connect inside constructor - Will slot be invoked before object is initialized?
- Qt can I connect signals/slots to self in constructor?
- QT Connect Signal Slot and initialize in constructor
根据这些,它似乎应该像其他任何东西一样“正常工作”。但是这段代码没有:
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。我的其他信号/插槽跨线程工作,但它们的connects 不在构造函数中。我想让这个自动化,这样每个实例都“刚刚连接”,而不必记住这样做。我不能那样做吗?
【问题讨论】:
标签: c++ multithreading qt signals-slots