Qt 正确的 connect() 调用

Qt proper connect() calling

我有一个关于 connect() 方法的问题,以下调用均无效:

connect(tutorial->back, SIGNAL(clicked()), this, SLOT(exit_button_clicked()));
connect(tutorial->back, &QPushButton::clicked(), this, &MyMainWindow::exit_button_clicked());

第一个不调用 exit_button_clicked(),第二个告诉我 clicked() 必须是静态的(在 Clion 中)并且不会编译。back 是一个 QPushButtontutorial 是自定义 QWidget class。通过调用自定义函数(以供进一步使用)来实现此方法很重要。谁能告诉我实现这个的正确方法?

更新:

问题出在我的 CMakeLists.txt 上,我在 classes 中添加了 set(CMAKE_AUTOMOC ON)Q_Object 宏,现在可以正常工作了。

我想,您的 exit_button_clicked() 被声明为私有或 public 函数(而不是插槽)。 Qt 自定义信号和槽必须以正确的方式声明。例如,您有 class 教程:

class Tutorial : QWidget {
    Q_OBJECT
    // Your class members go here.
    // Add this slot declaration:
    private slots:
        void exit_button_clicked();
}

(注意 private 旁边的 slots 关键字)。

插槽也可以 public 或受保护,如您所愿。

第一种情况,肯定是你的exit_button_clicked()槽有问题。它应该是一个简单的成员函数,带有 slots 说明符,在带有 Q_OBJECT 宏的 class 中使用 void 和 returning void。如果连接失败,它会在 运行 时将错误写入控制台(可能通过 qDebug())。

在第二种情况下,很明显您在函数名称后有额外的 ()。获取函数的地址如下所示:

connect(tutorial->back, &QPushButton::clicked, this, &MyMainWindow::exit_button_clicked);

&QPushButton::clicked() 尝试调用该函数并获取一个 return 值的地址,这当然会在编译时失败,因为 QPushButton::clicked 不是 static .

我希望这能说明问题。查看文档不会有任何危害。