2.4 对话框QDialog

作者: 223480235e8e | 来源:发表于2017-09-11 17:54 被阅读83次

    QDialog类是对话窗口的基类。

    对话窗口是一个顶层窗口,主要用于与用户进行简短交互,如果设置了父窗口,其显示的位置会在父窗口的中心。

    2.4.1 模态对话框

    模态对话框可以在相同的应用程序中阻止对其他可见窗口的输入。

    当应用程序的模态对话框打开时,用户必须完成与对话框的交互,并在访问应用程序的任何其他窗口之前关闭它。

    2.4.1.1 模态对话框的两种方式

    窗口模态对话框:只能阻止与对话框关联(它的父窗口、所有祖父窗口,以及父窗口和父窗口的所有兄弟姐妹)的窗口的访问,允许用户在应用程序中继续使用其他窗口。
    应用模态对话框:阻止应用程序的所有窗口输入。

    2.4.1.2 显示模态对话框

    调用它的exec()函数。当用户关闭对话框时,exec()将提供一个有用的返回值。通常,为了使对话框关闭后并返回适当的值,我们可以连接一个默认按钮,例如:OK按钮关联到accept()槽,Cancle按钮关联到reject()槽。或者可以调用done()槽,返回一个整数值。而根据这个返回值,我们就可以采取下一步动作了。
    调用setModal(true)或setWindowModality(),然后show()。与exec()不同,show()弹出对话框后,不需等待用户输入确认,便立即将控制权返回给调用者。

    2.4.2 非模态对话框

    非模态对话框是独立于同一应用程序中的其他窗口运行的对话框。在文字处理器中查找并替换对话框就是典型的非模态对话框。

    非模态对话框使用show()显示,它立即将控制权返回给调用者。

    如果在隐藏对话框后再调用show()函数,对话框将显示在原来的位置。

    2.4.3 模态对话框示例

    新建GUI项目ModelWidget,类名ModelWidget,基类选择QWidget。

    在生成的ui文件中添加如下控件 Paste_Image.png

    点击每个按钮,分别转到槽。

    再添加一个对话框界面类,选择“Dialog without buttons”,编辑信号槽,如下图

    Paste_Image.png
    main.cpp
    #include <QDebug>
    #include <QApplication>
    #include <QDialog>
    #include "modelwidget.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        ModelWidget w;
        w.show();
    
        //非模态对话框
        QDialog modelLessDlg;
        modelLessDlg.setWindowTitle("非模态对话框");
        modelLessDlg.show();
        modelLessDlg.resize(200, 100);
        qDebug() << "显示完非模态对话框后,不需要等用户操作就会立马执行我";
    
        return a.exec();
    }
    

    customdialog.h

    class ModelWidget : public QWidget
    {
        Q_OBJECT
    public:
        explicit ModelWidget(QWidget *parent = 0);
        ~ModelWidget();
    private slots:
        void on_btnWindow_clicked();
        void on_btnApp_clicked();
        void on_btnCustom_clicked();
    private:
        Ui::ModelWidget *ui;
    };
    

    customdialog.cpp

    #include <QDebug>
    #include <QDialog>
    #include "modelwidget.h"
    #include "ui_modelwidget.h"
    #include "customdialog.h"
    
    ModelWidget::ModelWidget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::ModelWidget)
    {
        ui->setupUi(this);
    }
    
    ModelWidget::~ModelWidget()
    {
        delete ui;
    }
    
    //弹出窗口模态对话框
    void ModelWidget::on_btnWindow_clicked()
    {
        QDialog* dlg = new QDialog(this);
        dlg->setAttribute(Qt::WA_DeleteOnClose);//设置对话框关闭后,自动销毁
        dlg->setWindowModality(Qt::WindowModal);
        dlg->show();
        qDebug() << "虽然显示模态对话框,但我不需要等用户操作完就会立马执行";
    }
    
    //弹出应用模态对话框
    void ModelWidget::on_btnApp_clicked()
    {
        QDialog* dlg = new QDialog(this);
        dlg->setAttribute(Qt::WA_DeleteOnClose);//设置对话框关闭后,自动销毁
        dlg->setWindowModality(Qt::ApplicationModal);//或者可以使用setModel(true)
        dlg->show();
        qDebug() << "虽然显示模态对话框,但我也不需要等用户操作完就会立马执行";
    }
    
    //自定义对话框
    void ModelWidget::on_btnCustom_clicked()
    {
        CustomDialog* dlg = new CustomDialog(this);
        dlg->setAttribute(Qt::WA_DeleteOnClose);//设置对话框关闭后,自动销毁
        int ret = dlg->exec();
        if (ret == QDialog::Accepted)
        {
            ui->lineEdit->setText("你点击了OK按钮");
        }
        else if (ret == QDialog::Rejected)
        {
            ui->lineEdit->setText("你点击了Cancle按钮");
        }
    }
    

    编译并运行程序。

    1. 点击弹出窗口模态对话框,那么你无法点击它的父窗口,但可以点击非模态对话框。

    2. 关闭窗口模态对话框,那么其他窗口就都可以点击了。

    3. 打开应用模态对话框,那么所有的其他窗口都无法再点击。

    4. 关闭应用模态对话框,打开自定义对话框,分别点击OK,Cancle和关闭按钮,查看LineEdit的内容。

    好的,关于模态对话框的内容我们就讲到这里,如果你想第一时间看到小豆君的技术分享,就赶快关注吧。

    相关文章

      网友评论

        本文标题:2.4 对话框QDialog

        本文链接:https://www.haomeiwen.com/subject/hnojdxtx.html