【问题标题】:Qt proper connect() callingQt 正确的 connect() 调用
【发布时间】:2015-07-05 07:58:33
【问题描述】:

我对@9​​87654322@ 方法有疑问,以下这些调用均不起作用:

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 中)并且不能编译。backQPushButtontutorial 是自定义@ 987654329@上课。通过调用自定义函数(以供进一步使用)来实现此方法很重要。谁能告诉我实现这个的正确方法?

更新:

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

【问题讨论】:

  • 您的exit_button_clicked() 是否在您的头文件中声明为插槽?
  • "谁能告诉我正确的实现方法??" Qt 文档有大约数万亿个。
  • @Slyps 是的,我知道(我已经阅读了一百遍)但是第一种方法必须生成正确的答案,我认为它没有任何问题。我只是想不通为什么它不起作用
  • @kefir500 是的,这是我的实现:link

标签: c++ qt signals-slots


【解决方案1】:

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

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

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

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

我希望这可以澄清它。查看文档不会造成任何伤害。

【讨论】:

  • 感谢您的回复,但它仍然不起作用(第二种方法),它给了我不理解的编译错误:link 关于第一个,这就是我的方式实现它:link
  • 我的CMakeLists.txt 文件是问题所在,我添加了set(CMAKE_AUTOMOC ON),现在它工作正常(两种方法),谢谢您的回复:-)
【解决方案2】:

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

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

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

插槽也可以是公开的或受保护的,如您所愿。

【讨论】:

  • 你的班级缺少Q_OBJECT
  • 是的,我已经删除了它,因为它给我编译错误:undefined reference to 'vtable for MyMenu'
  • 好的,我的CMakeLists.txt 文件有问题,我添加了set(CMAKE_AUTOMOC ON),现在它工作正常,谢谢您的回复:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多