我尝试实施退出按钮,但我无法使用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();
}
MyMainWindow
是MyMenu
的朋友类,exit
是私人QPushButton
。现在我想要一些帮助来解决这个问题。
答案 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
当执行某些操作的实际语法非常接近您对它的期望时,这非常好:)