【问题标题】:How to correctly link qt dialogs?如何正确链接qt对话框?
【发布时间】:2020-08-13 12:12:22
【问题描述】:

我需要绑定对话框,以便从主窗口打开“first_dialog”窗口,并带有两个按钮“ok”和“close”。单击“关闭”只会关闭窗口。单击“确定”应打开“second_dialog”,同时带有两个按钮“确定”和“关闭”。单击“关闭”将关闭“second_dialog”。如果你点击“ok”,那么“second_dialog”和“first_dialog”将被关闭,但应该调用主窗口槽。如何正确地做到这一点,草拟了一个例子。我尝试与destroyed () 信号绑定并编写自己的信号,但程序遇到了分段错误。

#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,SIGNAL(...),this,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()
{
    //....
}



【问题讨论】:

  • 如果您需要帮助,您需要提供带有完整代码的最小工作示例,而不仅仅是 sn-ps

标签: c++ windows qt qt-creator qdialog


【解决方案1】:

看起来您可以使用acceptreject 方法。当按下任一按钮时,在您的对话框中调用这些函数。然后只需确保检查返回值即可知道点击的是哪一个。

// 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();
}

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 2019-08-26
    相关资源
    最近更新 更多