c++ - Qt 我可以在构造函数中将信号/槽连接到自身吗?

标签 c++ qt signals-slots

编辑:与信号/插槽/连接无关。问题是构造函数调用构造函数。

可能有更好的方法来做到这一点 - 我很想听听那些......

我有一个派生自 QLabel 的 MyClass。我想在信号中传递更多关于派生类的数据,而不是基本信号所做的。所以我创建了一个插槽来拦截 customContextMenuRequested 信号并发出一个包含更多数据的修改后的信号。

当我尝试在构造函数中连接此信号时,我的插槽永远不会被调用。但是如果我移动 Policy 并将线连接到父窗口小部件(不是类层次结构父窗口)以便它们在 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。

最佳答案

实际上,如果您使用的是 C++11,则可以调用(某种程度上)另一个构造函数。它叫做delegating constructor .但我认为这不会使问题消失。您的问题似乎是调用 connect() 时未完全构造元对象。此外,您可能需要迁移到 Qt 5 才能使 C++11 正常工作。

解决方案是延迟连接,直到对象完全构造完成。你可以start a timer间隔为零。它将在下一个事件循环处理时触发,这肯定会在您的对象完全构建之后。

然后在您的 timerEvent 中,建立连接并终止计时器。

编辑:没有看到您的编辑。看起来你找到了解决方案。那就忽略这个。 :)

顺便说一句。您没有调用另一个构造函数。您创建了一个临时的 MyClass 对象。

关于c++ - Qt 我可以在构造函数中将信号/槽连接到自身吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11641297/

相关文章:

c++ - 如何管理 SFML 渲染, "signals"方式?

Qt:如何正确定义此代码的信号参数?

c++ - Arduino 十六进制转十进制

c++ - 在 C++ 应用程序中嵌入 Ruby 解释器

c++ - 在 Windows 上为 MinGW 编译的 C++ 程序是否适用于 Linux 上的 GNU 编译器?

c++ - 如何修改我的Qt PaintEvent代码以相对于鼠标指针缩放显示的Pixmap

java - 当前 View 不支持使用 Qt WebDriver 和 Selenium 的 Qml 应用程序的此命令

c++ - 有什么好的方法可以像 excel 一样在 MFC/c++ 程序中插入一个控件?

c++ - Qt中如何绘制模糊的透明背景

c++ - 如何判断何时在 QButtonGroup 中单击 QPushButton