在Qt中实现Exit按钮

时间:2015-07-04 13:24:24

标签: c++ qt signals-slots

我尝试实施退出按钮,但我无法使用connect()方法执行此操作。实际上我的按钮并没有发出任何信号,据我所知,但我找不到问题。 以下是使用connect()方法的代码的一部分:

#include "MyMainWindow.h"

MyMainWindow::MyMainWindow(QWidget * parent, Qt::WindowFlags flag) :
        QMainWindow(parent, flag)
{
    this->setFixedSize(1120, 630);
    menu = new MyMenu(this);
    this->setCentralWidget(menu);
    this->show();
    // the connect implementation
    connect(menu->exit, SIGNAL(clicked()), this, SLOT(this->exit_button_clicked()));
}

MyMainWindow::~MyMainWindow()
{
}

void MyMainWindow::exit_button_clicked()
{
    this->close();
}

MyMainWindowMyMenu的朋友类,exit是私人QPushButton。现在我想要一些帮助来解决这个问题。

3 个答案:

答案 0 :(得分:2)

SLOT是一个实际接受字符串而不是c ++ - 有效表达式的宏。

SLOT(this->exit_button_clicked())不会链接到正确的广告位。您需要改为编写SLOT(exit_button_clicked())。 Qt Creator的自动完成功能可以为所选对象建议有效的插槽。

推荐的替代方案是使用new syntax。如果您的编译器支持C ++ 11,您可以在Qt 5中使用它。这种语法的优点是信号,槽和它们的参数的编译时检查。

如果menu->exit是私有的,则除非将其声明为friend class,否则无法从其他类访问它。您可能需要在MyMenu类中创建一个公共getter。

答案 1 :(得分:1)

您可以直接使用

connect(menu->exit, SIGNAL(clicked()), this, SLOT(close()));

无需将新方法exit_button_clicked()创建为SLOT

答案 2 :(得分:0)

即使有一个解决方案没有使用lambdas,但对于简单的操作,lambdas工作得很好:

Wireshark

当执行某些操作的实际语法非常接近您对它的期望时,这非常好:)