编辑:与信号/插槽/连接无关。问题是构造函数调用构造函数。
可能有更好的方法来做到这一点 - 我有兴趣听到这些......
我有从 QLabel 派生的 MyClass。我想在信号中传递更多有关派生类的数据,而不是基本信号的数据。因此,我创建了一个插槽来拦截 customContextMenuRequested 信号并发出具有更多数据的修订信号。
当我尝试在构造函数中连接此信号时,我的插槽永远不会被调用。但是,如果我移动策略并将线路连接到父小部件(不是类层次结构父级),以便它们在 MyClass 完全构造后执行,那么我的插槽将被调用。但我总是希望将其连接到这个类,这似乎是我想要在它的构造函数中实现的东西,而不是指望父类记住这样做。
我做错了什么吗?或者向信号添加数据的更好方法?
MyClass::MyClass() : QLabel()
{
QFont currFont = font();
currFont.setPointSize(15);
setFont(currFont);
setBackgroundRole(QPalette::Mid);
std::cout << "connecting customContextMenuRequested" << std::endl;
/** PROBLEM START */
setContextMenuPolicy(Qt::CustomContextMenu);
// Is there anything wrong with connecting from "this" to "this" in a constructor?
QObject::connect(this, SIGNAL(customContextMenuRequested(const QPoint&)),
this, SLOT(addCellDataToMenuContextRequest(const QPoint&)));
/* PROBLEM END **/
}
MyClass::MyClass(QString &cellString, int row, int col)
: QLabel(cellString)
{
MyClass();
setRow(row);
setCol(col);
}
// This one is a slot
void MyClass::addCellDataToMenuContextRequest(const QPoint& pos)
{
// This doesn't get printed if I connect in my constructor,
// but it does print if I do the same connect from a parent widget.
std::cout << "called addCellDataToMenuContextRequest" << std::endl;
emit customContextMenuRequestedForCell(pos, _row, _col);
}
因此,我希望父小部件只查找 customContextMenuRequested ForCell,但现在,父小部件似乎也需要负责 customContextMenuRequested。
实际上,如果您使用 C++11,您可以调用(某种程度上)另一个构造函数。它被称为委托构造函数 http://en.wikipedia.org/wiki/C++11#Object_construction_improvement。但我不认为这会让问题消失。您的问题似乎是元对象在以下情况下未完全构造connect()
叫做。此外,您可能需要迁移到 Qt 5 才能使 C++11 工作。
解决方案是延迟连接,直到对象完全构造完成。你可以启动计时器 http://qt-project.org/doc/qt-4.8/qobject.html#startTimer间隔为零。它将在下一个事件循环处理时触发,这肯定是在您的对象完全构造之后。
然后在您的计时器事件中建立连接并终止计时器。
EDIT:没有看到您的编辑。看起来你找到了解决方案。那就忽略这个吧。 :)
顺便提一句。您没有调用另一个构造函数。您创建了一个临时 MyClass 对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)