我有一个简单的代码;在这里我有两个按钮,我按下第一个按钮,它显示了一个MsgBox。然后我按下" Okay",应该调用用第二个按钮写的连接动作,但它没有。相反,我得到一个错误:
Object::connect: No such signal QMessageBox::buttonClicked(QMessageBox::Ok)
Object::connect: (receiver name: 'OpenFile_Bttn')
代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_OpenFile_Bttn_clicked(){
QFileDialog::getOpenFileName(this,tr("Open file"), "", tr(""));//Open a dialog "OpenFile"
}
void MainWindow::on_pushButton_clicked(){
QMessageBox msgBox;
msgBox.setText("Push button to choose a file");
//Connect clicking button in MsgBox to an action in OpenFile_Bttn button
QWidget::connect(&msgBox,SIGNAL(buttonClicked(QMessageBox::Ok)),
ui->OpenFile_Bttn, SLOT(on_OpenFile_Bttn_clicked()));
msgBox.exec();//Show MsgBox
}
另外我发现了一个有趣的事情,当一个MsgBox弹出窗口时出现错误信息,但是当我点击按钮时出现错误信息" Ok"在MsgBox内部。
答案 0 :(得分:5)
此处不需要信号,exec返回点击的按钮。
void MainWindow::on_OpenFile_Bttn_clicked(){
QFileDialog::getOpenFileName(this,tr("Open file"), "", tr(""));//Open a dialog "OpenFile"
}
void MainWindow::on_pushButton_clicked(){
QMessageBox msgBox;
msgBox.setText("Push button to choose a file");
//Connect clicking button in MsgBox to an action in OpenFile_Bttn button
if(msgBox.exec() == QMessageBox::Ok)
{
on_OpenFile_Bttn_clicked();
}
}
如果你想使用自定义按钮,你仍然可以在exec之后调用msgBox.buttonClicked()
来找出点击了哪个按钮。
答案 1 :(得分:2)
如果你这样做而不是你得到一个编译器错误,这样你就可以看到编译错误而不是运行时错误
QObject::connect(msgBox, &QMessageBox::buttonClicked, ui->OpenFile_Bttn, &QPushButton::clicked);
出于兴趣,上面的代码是未经测试的,可能不会编译但是basicallt只做发送者,信号,接收器,插槽但是使用他们的类对象来选择上面显示的信号和插槽然后你会更容易发现编译错误告诉你什么可能是错的