编辑:与信号/插槽/连接无关。问题在于构造函数调用构造函数。
可能有更好的方法来解决这个问题 - 我很想听听那些方法...
我有一个从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);
}
所以我希望父部件只需要查找 customContextMenuRequestedForCell,但现在,父部件似乎还需要负责customContextMenuRequested。