问题描述
我需要绑定对话框,以便使用两个按钮“确定”和“关闭”从主窗口打开“ first_dialog”窗口。单击“关闭”仅会关闭窗口。单击“确定”应同时使用两个按钮“确定”和“关闭”打开“ second_dialog”。单击“关闭”将关闭“ second_dialog”。如果单击“确定”,则将关闭“ second_dialog”和“ first_dialog”,但应调用mainwindow插槽。如何正确地做一个例子。我试图与destroy()信号绑定并编写自己的信号,但是该程序遇到了分段错误。
#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_pushButton_clicked()
{
first_dialog* a= new first_dialog(this);
//connect(a,SIGNAL(...),this,SLOT(new_button));
a->exec();
}
#include "first_dialog.h"
#include "ui_first_dialog.h"
first_dialog::first_dialog(QWidget *parent) :
QDialog(parent),ui(new Ui::first_dialog)
{
ui->setupUi(this);
}
first_dialog::~first_dialog()
{
delete ui;
}
void first_dialog::on_pushButton_clicked()
{
second_dialog* a =new second_dialog(this);
//connect(a,SLOT(...));
a->exec();
}
void first_dialog::on_pushButton_2_clicked()
{
this->close();
}
#include "second_dialog.h"
#include "ui_second_dialog.h"
second_dialog::second_dialog(QWidget *parent) :
QDialog(parent),ui(new Ui::second_dialog)
{
ui->setupUi(this);
}
second_dialog::~second_dialog()
{
delete ui;
}
void second_dialog::on_pushButton_2_clicked()
{
this->close();
}
void second_dialog::on_pushButton_clicked()
{
//....
}
解决方法
您似乎可以使用accept
和reject
方法。当您按下任一按钮时,在对话框中调用这些功能。然后只需确保检查返回值即可知道单击了哪个。
// MainWindow.cpp
void MainWindow::on_pushButton_clicked()
{
first_dialog* a= new first_dialog(this);
if (a->exec() == QDialog::Accepted)
{
// Both dialogs were accepted
}
else
{
// First dialog was canceled
}
}
// first_dialog.cpp
void first_dialog::on_pushButton_clicked()
{
second_dialog* a =new second_dialog(this);
if (a->exec() == QDialog::Accepted)
{
// Second dialog was accepted,so accept the first dialog too.
accept();
}
else
{
// Second dialog was canceled
}
}
void first_dialog::on_pushButton_2_clicked()
{
reject();
}
// second_dialog.cpp
void second_dialog::on_pushButton_clicked()
{
accept();
}
void second_dialog::on_pushButton_2_clicked()
{
reject();
}