【发布时间】:2012-07-23 09:17:03
【问题描述】:
编辑:与信号/插槽/连接无关。问题是构造函数调用构造函数。
可能有更好的方法来做到这一点 - 我很想听听这些......
我有从 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。
【问题讨论】:
-
根据this question,像这样从另一个构造函数调用一个构造函数是不可行的。你确定那部分工作正常吗?因为否则它对我来说确实很好......
-
你是对的。我的构造函数调用另一个构造函数是问题所在。我分离到一个初始化文件并且连接工作。谢谢!
标签: c++ qt signals-slots