精华内容
下载资源
问答
  • QDialog是对话框类控件,PyQt5种定义了一系列的标准对话框类。 QMessageBox:用来显示消息对话框 QColorDialog:颜色对话框 QFileDialog:用来打开和保存文件的对话框 QFontDialog:用来改变字体的对话框 ...
  • QT QDialog 圆角实现

    2018-04-02 12:06:59
    QDialog 使用css 设置一个对话框为圆角。主要思路是QDialog为一个容器,设置透明后,要对里面的控件进行设置圆角。
  • QDialog

    2021-06-14 17:08:16
    QDialog对话框类,一般用到模态对话框和非模态对话框 -模态对话框: QDialog *log = new QDialog(this) log->exec(); 非模态对话框 QDialog *log = new QDialog(this) log->show(); 所以模态和非模态就是...

    QDialog对话框类,一般用到模态对话框和非模态对话框
    -模态对话框:

    QDialog *log = new QDialog(this)
    log->exec();
    
    • 非模态对话框
    QDialog *log = new QDialog(this)
    log->show();
    

    所以模态和非模态就是表现形式不同

    展开全文
  • 一个小例程,演示了如何用代码向QWidget和QDialog添加菜单项,以及如何响应菜单,简单易懂。
  • QWidget中没有QDialog的exec方法,使用QWidget实现QDialog的exec()方法小例子
  • 主要介绍了python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择,需要的朋友可以参考下
  • 不错的QDialog示例

    2020-04-04 23:25:06
    qt开发过程中需要使用QDialog来进行界面开发,这个资源是一个很好的QDialog实例,可以供大家开发前参考
  • 自定义标题栏可缩放的QDialog,作为基类被继承,方便快捷第制作自定义的界面。
  • QWidget,QMainWindow和QDialog的区别.
  • Qt中的QDialog

    千次阅读 2020-02-29 15:16:14
    文章目录1 Qt中的QDialog1.1 QDialog简介1.2 模态对话框和非模态对话框1.3 对话框的返回值 1 Qt中的QDialog 1.1 QDialog简介 对话框的概念: 对话框是与用户进行简短交互的顶层窗口。 QDialog是Qt中所有对话框窗口...

    1 Qt中的QDialog

    1.1 QDialog简介

    对话框的概念:

    • 对话框是与用户进行简短交互的顶层窗口。
    • QDialog是Qt中所有对话框窗口的基类。
    • QDialog继承于QWidget是一种容器类型的组件。
      在这里插入图片描述
      QDialog的意义:
    • QDialog作为一种专用的交互窗口而存在。
    • QDialog不能作为子部件嵌入其它容器中。
    • QDialog是定制了窗口样式的特殊的QWidget。

    注意:如果QDialog没有指定parent是不会一直处于最上层的,如果制定了parent则会一直处于最上层。

    1.2 模态对话框和非模态对话框

    模态对话框(QDialog::exec()):

    • 显示后无法与父窗口进行交互。
    • 是一种阻塞式的对话框调用方式。

    非模态对话框(QDialog::show()):

    • 显示后独立存在可以同时与父窗口进行交互。
    • 是一种非阻塞式的对话框调用方式。

    一般情况下:

    • 模态对话框用于必须依赖用户选择的场合(80%):
      • 消息提示、文件选择、打印设置等。
    • 非模态对话框用于特殊功能设置的场合(20%):
      • 查找操作、属性设置等。

    小技巧:

    • 在栈上创建模态对话框是最简单常用的方式。
    • 一般情况下非模态对话框需要在堆上创建。
    • 通过QDialog::setModal函数可以创建混合特性的对话框(不会阻塞,但是必须做出选择)。
    • 非模态对话框需要指定Qt::WA_DeleteOnClose属性。

    测试代码如下:
    在这里插入图片描述
    Dialog.h:

    #ifndef DIALOG_H
    #define DIALOG_H
    
    #include <QtGui/QDialog>
    #include <QPushButton>
    
    class Dialog : public QDialog
    {
        Q_OBJECT
    protected:
        QPushButton ModalBtn;
        QPushButton NormalBtn;
        QPushButton MixedBtn;
    protected slots:
        void ModalBtn_Clicked();
        void NormalBtn_Clicked();
        void MixedBtn_Clicked();
    public:
        Dialog(QWidget *parent = 0);
        ~Dialog();
    };
    
    #endif // DIALOG_H
    
    

    Dialog.cpp:

    #include "Dialog.h"
    
    #include <QDebug>
    
    Dialog::Dialog(QWidget *parent) :
            QDialog(parent), ModalBtn(this), NormalBtn(this), MixedBtn(this)
    {
        ModalBtn.setText("Modal Dialog");
        ModalBtn.move(20, 20);
        ModalBtn.resize(100, 30);
    
        NormalBtn.setText("Normal Dialog");
        NormalBtn.move(20, 70);
        NormalBtn.resize(100, 30);
    
        MixedBtn.setText("Mixed Dialog");
        MixedBtn.move(20, 120);
        MixedBtn.resize(100, 30);
    
        connect(&ModalBtn, SIGNAL(clicked()), this, SLOT(ModalBtn_Clicked()));
        connect(&NormalBtn, SIGNAL(clicked()), this, SLOT(NormalBtn_Clicked()));
        connect(&MixedBtn, SIGNAL(clicked()), this, SLOT(MixedBtn_Clicked()));
    
        resize(140, 170);
    }
    
    void Dialog::ModalBtn_Clicked()
    {
        qDebug() << "ModalBtn_Clicked() Begin";
    
        QDialog dialog(this);
    
        dialog.exec();
    
        qDebug() << "ModalBtn_Clicked() End";
    }
    
    void Dialog::NormalBtn_Clicked()
    {
        qDebug() << "NormalBtn_Clicked() Begin";
    
        QDialog* dialog = new QDialog(this);
    
        dialog->setAttribute(Qt::WA_DeleteOnClose);
        dialog->show();
    
        qDebug() << "NormalBtn_Clicked() End";
    }
    
    void Dialog::MixedBtn_Clicked()
    {
        qDebug() << "MixedBtn_Clicked() Begin";
    
        QDialog* dialog = new QDialog(this);
    
        dialog->setAttribute(Qt::WA_DeleteOnClose);
        dialog->setModal(true);
        dialog->show();
    
        qDebug() << "MixedBtn_Clicked() End";
    }
    
    Dialog::~Dialog()
    {
        qDebug() << "~Dialog()";
    }
    
    

    main.cpp:

    #include <QtGui/QApplication>
    #include <QWidget>
    #include <QDialog>
    #include <QDebug>
    #include "Dialog.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Dialog dlg;
       	dlg.show();
       	
        return a.exec();
    }
    
    

    1.3 对话框的返回值

    只有模态对话框才有返回值的概念:

    • 模态对话框的返回值用于表示交互结果。
    • QDialog::exec()的返回值为交互结果:
      • void QDialog::done(int i)关闭对话框并将参数作为交互结果。
      • QDialog::Accepted:用户操作成功。
      • QDialog:Rejected:用户操作失败。

    测试代码如下:
    QDialog.h的代码和上面一样,就不贴了。

    QDialog.cpp:

    #include "Dialog.h"
    
    #include <QDebug>
    
    Dialog::Dialog(QWidget *parent) :
            QDialog(parent), ModalBtn(this), NormalBtn(this), MixedBtn(this)
    {
        ModalBtn.setText("Modal Dialog");
        ModalBtn.move(20, 20);
        ModalBtn.resize(100, 30);
    
        NormalBtn.setText("Normal Dialog");
        NormalBtn.move(20, 70);
        NormalBtn.resize(100, 30);
    
        MixedBtn.setText("Mixed Dialog");
        MixedBtn.move(20, 120);
        MixedBtn.resize(100, 30);
    
        connect(&ModalBtn, SIGNAL(clicked()), this, SLOT(ModalBtn_Clicked()));
        connect(&NormalBtn, SIGNAL(clicked()), this, SLOT(NormalBtn_Clicked()));
        connect(&MixedBtn, SIGNAL(clicked()), this, SLOT(MixedBtn_Clicked()));
    
        resize(140, 170);
    }
    
    void Dialog::ModalBtn_Clicked()
    {
        done(Accepted);
    }
    
    void Dialog::NormalBtn_Clicked()
    {
        done(Rejected);
    }
    
    void Dialog::MixedBtn_Clicked()
    {
        done(100);
    }
    
    Dialog::~Dialog()
    {
        qDebug() << "~Dialog()";
    }
    
    

    main.cpp:

    #include <QtGui/QApplication>
    #include <QWidget>
    #include <QDialog>
    #include <QDebug>
    #include "Dialog.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Dialog dlg;
        int r = dlg.exec();
    
        if( r == QDialog::Accepted )
        {
            qDebug() << "Accepted";
        }
        else if( r == QDialog::Rejected )
        {
            qDebug() << "Rejected";
        }
        else
        {
            qDebug() << r;
        }
        
        return r;
    }
    
    

    2 登陆对话框实例分析

    2.1 分析

    登陆对话框是应用程序中的常用部件,思考:如何开发一个可以在不同项目间复用的登陆对话框?

    登陆对话框需求分析:

    • 可复用软件部分。
    • 获取用户名和密码。

    附加需求:

    • 随机验证码。

    在这里插入图片描述

    登陆对话框的设计与架构:
    在这里插入图片描述
    如何获取用户输入的用户名和密码:

    • 如何在两个不同的对话框之间传递数据?

    在这里插入图片描述
    对话框之间通过成员变量和成员函数传递数据:

    • 将用户数据保存在私有成员变量中。
    • 通过公有成员函数进行数据传递。

    我们话可以进一步开发(这里未完成):

    • 检查用户名和密码是否为空:
      • 当用户名或密码为空时提示错误。
    • 随机验证码:
      • 当验证码输入错误时进行提示。
      • 验证码随机刷新。

    2.2 代码实现

    代码组织如下:
    在这里插入图片描述

    QLoginDialog.h:

    #ifndef _QLOGINDIALOG_H_
    #define _QLOGINDIALOG_H_
    
    #include <QtGui/QDialog>
    #include <QLabel>
    #include <QLineEdit>
    #include <QPushButton>
    
    class QLoginDialog : public QDialog
    {
        Q_OBJECT
    private:
        QLabel UserLabel;
        QLabel PwdLabel;
        QLineEdit UserEdit;
        QLineEdit PwdEdit;
        QPushButton LoginBtn;
        QPushButton CancelBtn;
        QString m_user;
        QString m_pwd;
    private slots:
        void LoginBtn_Clicked();
        void CancelBtn_Clicked();
    public:
        QLoginDialog(QWidget *parent = 0);
        QString getUser();
        QString getPwd();
        ~QLoginDialog();
    };
    
    
    #endif
    
    

    QLoginDialog.cpp:

    #include "QLoginDialog.h"
    
    QLoginDialog::QLoginDialog(QWidget *parent)
        : QDialog(parent, Qt::WindowCloseButtonHint), m_lblName(this), m_lblPwd(this), m_editName(this), m_editPwd(this),
          m_btnCancle(this), m_btnLogin(this)
    {
        setWindowTitle("Login");
        setFixedSize(285, 170);
    
        m_lblName.setText("User ID:");
        m_lblName.resize(80, 25);
        m_lblName.move(10, 30);
    
        m_lblPwd.setText("Password:");
        m_lblPwd.resize(80, 25);
        m_lblPwd.move(10, 65);
    
        m_editName.move(95, 30);
        m_editName.resize(180, 25);
    
        m_editPwd.move(95, 65);
        m_editPwd.resize(180, 25);
        m_editPwd.setEchoMode(QLineEdit::Password);
    
        m_btnCancle.setText("Cancle");
        m_btnCancle.resize(85, 30);
        m_btnCancle.move(95, 110);
    
        m_btnLogin.setText("Login");
        m_btnLogin.resize(85, 30);
        m_btnLogin.move(190, 110);
    
        connect(&m_btnCancle, SIGNAL(clicked()), this, SLOT(onBtnCancleClicked()));
        connect(&m_btnLogin, SIGNAL(clicked()), this, SLOT(onBtnLoginClicked()));
    }
    
    void QLoginDialog::onBtnCancleClicked()
    {
        m_name = "";
        m_pwd = "";
    
        done(Rejected);
    }
    
    void QLoginDialog::onBtnLoginClicked()
    {
        m_name = m_editName.text().trimmed();
        m_pwd = m_editPwd.text();
    
        done(Accepted);
    }
    
    QString QLoginDialog::getName()
    {
        return m_name;
    }
    
    QString QLoginDialog::getPwd()
    {
        return m_pwd;
    }
    
    QLoginDialog::~QLoginDialog()
    {
        
    }
    
    

    Widget.h:

    #ifndef _WIDGET_H_
    #define _WIDGET_H_
    
    #include <QtGui/QWidget>
    #include <QPushButton>
    
    class Widget : public QWidget
    {
        Q_OBJECT
    private:
        QPushButton TestBtn;
    private slots:
        void TestBtn_Clicked();
    public:
        Widget(QWidget *parent = 0);
        ~Widget();
    };
    
    #endif
    
    

    Widget.cpp:

    #include "Widget.h"
    #include "QLoginDialog.h"
    #include "QDebug"
    
    Widget::Widget(QWidget *parent) :
        QWidget(parent), m_btnTestLoginDialog(this)
    {
        m_btnTestLoginDialog.setText("Test login dialog");
    
        setFixedSize(300, 200);
    
        connect(&m_btnTestLoginDialog, SIGNAL(clicked()), this, SLOT(onBtnTest()));
    }
    
    
    void Widget::onBtnTest()
    {
        QLoginDialog loginDlg(this);
    
        if (loginDlg.exec() == QDialog::Accepted)
        {
            qDebug() << loginDlg.getName();
            qDebug() << loginDlg.getPwd();
        }
    }
    
    

    main.cpp:

    #include <QtGui/QApplication>
    #include "QLoginDialog.h"
    #include "Widget.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Widget w;
        w.show();
        
        return a.exec();
    }
    
    

    2.3 登录对话框的改进

    分析下如上对话框存在的问题:

    • 没有实现验证码功能,容易被恶意程序攻击,盗取用户名和密码。

    改进思路-验证码机制:

    1. 随机产生验证码。
    2. 用户后填写。
    3. 判断用户识别的正确性。

    需求:

    • 验证码必须能够有效避开恶意程序的识别!

    关于验证码和恶意程序:

    • 自动测试原理:
      • 利用一些特殊的系统函数能够通过代码控制程序,从而模拟用户操作。
    • 恶意程序:
      • 使用自动测试原理对目标程序进行控制,从而盗取信息或进行攻击。
    • 验证码:
      • 随机产生,用户容易识别,程序难以识别,从而有效避免恶意攻击。

    需要注意的问题:

    • 验证码必须动态随机产生。
    • 验证码的显示避开使用标准组件(标签、文本框等)。
    • 验证码应该附带足够多的障碍增加程序识别难度。

    解决方案:

    1. 随机产生目标验证码。
    2. 将验证码直接绘制于登录对话框。
    3. 验证码中的字符颜色随机改变。
    4. 在验证码区域随机绘制噪点。

    关于随机数:

    • 计算机无法产生真正意义上的随机数。
    • 计算机只能模拟随机数序列(伪随机数)。
    • 随机种子决定每次产生的随机序列是否相同。

    在这里插入图片描述
    随机产生验证码:
    在这里插入图片描述
    验证码绘制:
    在这里插入图片描述
    改进后的代码如下:

    QLoginDialog.h:

    #ifndef _QLOGINDIALOG_H_
    #define _QLOGINDIALOG_H_
    
    #include <QtGui/QDialog>
    #include <QLabel>
    #include <QLineEdit>
    #include <QPushButton>
    #include <QTimer>
    
    class QLoginDialog : public QDialog
    {
        Q_OBJECT
    private:
        QLabel UserLabel;
        QLabel PwdLabel;
        QLabel CaptLabel;
        QLineEdit UserEdit;
        QLineEdit PwdEdit;
        QLineEdit CaptEdit;
        QPushButton LoginBtn;
        QPushButton CancelBtn;
        QString m_user;
        QString m_pwd;
        QString m_captcha;
        Qt::GlobalColor* m_colors;
        QTimer m_timer;
    private slots:
        void LoginBtn_Clicked();
        void CancelBtn_Clicked();
        void Timer_Timeout();
    protected:
        void paintEvent(QPaintEvent *);
        QString getCaptcha();
        Qt::GlobalColor* getColors();
    public:
        QLoginDialog(QWidget *parent = 0);
        QString getUser();
        QString getPwd();
        ~QLoginDialog();
    };
    
    
    #endif
    
    

    QLoginDialog.cpp:

    #include "QLoginDialog.h"
    #include <QPainter>
    #include <QTime>
    #include <QDebug>
    #include <QMessageBox>
    
    QLoginDialog::QLoginDialog(QWidget* parent) : QDialog(parent, Qt::WindowCloseButtonHint),
        UserLabel(this), PwdLabel(this), CaptLabel(this),
        UserEdit(this), PwdEdit(this), CaptEdit(this),
        LoginBtn(this), CancelBtn(this)
    {
        UserLabel.setText("User ID:");
        UserLabel.move(20, 30);
        UserLabel.resize(60, 25);
    
        UserEdit.move(85, 30);
        UserEdit.resize(180, 25);
    
        PwdLabel.setText("Password:");
        PwdLabel.move(20, 65);
        PwdLabel.resize(60,25);
    
        PwdEdit.move(85, 65);
        PwdEdit.resize(180, 25);
        PwdEdit.setEchoMode(QLineEdit::Password);
    
        CaptLabel.setText("Captcha:");
        CaptLabel.move(20, 100);
        CaptLabel.resize(60, 25);
    
        CaptEdit.move(85, 100);
        CaptEdit.resize(85, 25);
    
        CancelBtn.setText("Cancel");
        CancelBtn.move(85, 145);
        CancelBtn.resize(85, 30);
    
        LoginBtn.setText("Login");
        LoginBtn.move(180, 145);
        LoginBtn.resize(85, 30);
    
        m_timer.setParent(this);
    
        setWindowTitle("Login");
        setFixedSize(285, 205);
    
        connect(&m_timer, SIGNAL(timeout()), this, SLOT(Timer_Timeout()));
        connect(&LoginBtn, SIGNAL(clicked()), this, SLOT(LoginBtn_Clicked()));
        connect(&CancelBtn, SIGNAL(clicked()), this, SLOT(CancelBtn_Clicked()));
    
        qsrand(QTime::currentTime().second() * 1000 + QTime::currentTime().msec());
    
        m_captcha = getCaptcha();
        m_colors = getColors();
    
        m_timer.start(100);
    }
    
    void QLoginDialog::LoginBtn_Clicked()
    {
        qDebug() << "LoginBtn_Clicked() Begin";
    
        QString captcha = CaptEdit.text().replace(" ", "");
    
        if( m_captcha.toLower() == captcha.toLower() )
        {
            m_user = UserEdit.text().trimmed();
            m_pwd = PwdEdit.text();
    
            if( m_user == "" )
            {
                QMessageBox::information(this, "Info", "User ID can NOT be empty!");
            }
            else if( m_pwd == "" )
            {
                QMessageBox::information(this, "Info", "Password can NOT be empty!");
            }
            else
            {
                done(Accepted);
            }
        }
        else
        {
            QMessageBox::critical(this, "Error", "The captcha is NOT matched!");
    
            m_captcha = getCaptcha();
    
            CaptEdit.selectAll();
        }
    
        qDebug() << "LoginBtn_Clicked() End";
    }
    
    void QLoginDialog::CancelBtn_Clicked()
    {
        qDebug() << "CancelBtn_Clicked() Begin";
    
        done(Rejected);
    
        qDebug() << "CancelBtn_Clicked() End";
    }
    
    QString QLoginDialog::getUser()
    {
        return m_user;
    }
    
    QString QLoginDialog::getPwd()
    {
        return m_pwd;
    }
    
    void QLoginDialog::Timer_Timeout()
    {
        m_colors = getColors();
    
        update();
    }
    
    void QLoginDialog::paintEvent(QPaintEvent *)
    {
        QPainter painter(this);
    
        painter.fillRect(180, 100, 84, 24, Qt::white);
    
        painter.setFont(QFont("Comic Sans MS", 12));
    
        for(int i=0; i<150; i++)
        {
            painter.setPen(m_colors[i%4]);
            painter.drawPoint(180 + qrand() % 84, 100 + qrand() % 24);
        }
    
        for(int i=0; i<4; i++)
        {
            painter.setPen(m_colors[i]);
            painter.drawText(180 + 20 * i, 100, 20, 24, Qt::AlignCenter, QString(m_captcha[i]));
        }
    }
    
    QString QLoginDialog::getCaptcha()
    {
        QString ret = "";
    
        for(int i=0; i<4; i++)
        {
            int c = (qrand() % 2) ? 'a' : 'A';
    
            ret += static_cast<QChar>(c + qrand() % 26);
        }
    
        return ret;
    }
    
    Qt::GlobalColor* QLoginDialog::getColors()
    {
        static Qt::GlobalColor colors[4];
    
        for(int i=0; i<4; i++)
        {
            colors[i] = static_cast<Qt::GlobalColor>(2 + qrand() % 16);
        }
    
        return colors;
    }
    
    QLoginDialog::~QLoginDialog()
    {
    
    }
    
    
    

    Widget.h:

    #ifndef _WIDGET_H_
    #define _WIDGET_H_
    
    #include <QtGui/QWidget>
    #include <QPushButton>
    
    class Widget : public QWidget
    {
        Q_OBJECT
    private:
        QPushButton TestBtn;
    private slots:
        void TestBtn_Clicked();
    public:
        Widget(QWidget *parent = 0);
        ~Widget();
    };
    
    #endif
    
    

    Widget.cpp:

    #include "Widget.h"
    #include "QLoginDialog.h"
    
    #include <QDebug>
    
    Widget::Widget(QWidget *parent) : QWidget(parent), TestBtn(this)
    {
        TestBtn.setText("Test Login Dialog");
    
        setFixedSize(200, 50);
    
        connect(&TestBtn, SIGNAL(clicked()), this, SLOT(TestBtn_Clicked()));
    }
    
    void Widget::TestBtn_Clicked()
    {
        QLoginDialog dlg;
    
        if( dlg.exec() == QDialog::Accepted )
        {
            qDebug() << "User: " + dlg.getUser();
            qDebug() << "Pwd: " + dlg.getPwd();
        }
    }
    
    Widget::~Widget()
    {
        
    }
    
    

    main.cpp:

    #include <QtGui/QApplication>
    #include "widget.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Widget w;
        w.show();
        
        return a.exec();
    }
    
    

    3 Qt种的标准对话框

    标准对话框:

    • Qt为开发者提供了一些可复用的对话框类型。
    • Qt提供的可复用对话框全部继承自QDialog类。
      在这里插入图片描述
      Qt中的标准对话框遵循相同的使用方式:
      在这里插入图片描述

    参考资料:

    1. QT实验分析教程
    展开全文
  • 10 QDialog和进度条.zip

    2019-11-02 19:32:23
    qt video,从基础开始,第10部分,一共14部分,使用vs2015的addin作为教学工具,很不错的。
  • PyQt5 组件之QDialog

    2021-08-16 17:52:06
    QDialog简介 QDialog类的子类主要有QMessageBox,QFileDialog,QColorDialog,QFontDialog,QInputDialog等。 QDialog 常用的方法 方法 描述 setWindowTitle() 设置对话框标题 setWindowModality() ...

    QDialog简介

    QDialog类的子类主要有QMessageBox,QFileDialog,QColorDialog,QFontDialog,QInputDialog等。

    QDialog 常用的方法

    方法描述
    setWindowTitle()设置对话框标题
    setWindowModality()设置窗口模态,取值如下
    Qt.NonModal:非模态,可以和程序的其他窗口进行交互
    Qt.WindowModal:窗口模态,程序在未处理玩当前对话框时,将阻止和对话框的父窗口进行交互
    Qt.ApplicationModal:应用程序模态,阻止和任何其他窗口进行交互

    QDialog 效果截图:

     

     PyQt 设计器截图: 

     *.ui 转换为*.py 代码  

    # -*- coding: utf-8 -*-
    
    # Form implementation generated from reading ui file 'untitled7.ui'
    #
    # Created by: PyQt5 UI code generator 5.15.4
    #
    # WARNING: Any manual changes made to this file will be lost when pyuic5 is
    # run again.  Do not edit this file unless you know what you are doing.
    import sys
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtCore import Qt
    from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog, QPushButton
    
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(800, 600)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
            self.verticalLayoutWidget.setGeometry(QtCore.QRect(270, 110, 160, 80))
            self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
            self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
            self.verticalLayout.setContentsMargins(0, 0, 0, 0)
            self.verticalLayout.setObjectName("verticalLayout")
            self.pushButton = QtWidgets.QPushButton(self.verticalLayoutWidget)
            self.pushButton.setObjectName("pushButton")
            # 点击按钮事件,弹出对话框
            self.pushButton.clicked.connect(self.showdialog)
    
            self.verticalLayout.addWidget(self.pushButton)
            MainWindow.setCentralWidget(self.centralwidget)
    
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            self.pushButton.setText(_translate("MainWindow", "PushButton"))
    
        def showdialog(self):
            # 创建QDialog对象
            dialog = QDialog()
            # 创建按钮到新创建的dialog对象中
            btn = QPushButton('ok', dialog)
            # 移动按钮,设置dialog的标题
            btn.move(50, 50)
            dialog.setWindowTitle("Dialog")
    
            # 设置窗口的属性为ApplicationModal模态,用户只有关闭弹窗后,才能关闭主界面
            dialog.setWindowModality(Qt.ApplicationModal)
            dialog.exec_()
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        MainWindow = QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    

     需要向PyUIC 生成的代码,添加如下代码片段:

    重点实现QPushButton事件绑定

            # 点击按钮事件,弹出对话框
            self.pushButton.clicked.connect(self.showdialog)
        def showdialog(self):
            # 创建QDialog对象
            dialog = QDialog()
            # 创建按钮到新创建的dialog对象中
            btn = QPushButton('ok', dialog)
            # 移动按钮,设置dialog的标题
            btn.move(50, 50)
            dialog.setWindowTitle("Dialog")
    
            # 设置窗口的属性为ApplicationModal模态,用户只有关闭弹窗后,才能关闭主界面
            dialog.setWindowModality(Qt.ApplicationModal)
            dialog.exec_()

    展开全文
  • <p>Qdialog窗口内不需要任何控件,只是提醒后台程序正在进行中,用exec()也是禁止操作主窗口,但现在循环执行完毕,不知如何关闭Qdialog窗口。只关闭Qdialog窗口,然后可以继续执行...
  • Qt 5——对话框QDialog

    千次阅读 2020-06-19 16:28:26
    文章目录基本概念标准对话框自定义消息框模态对话框非模态对话框消息对话框标准文件对话框以上知识示例结果cpp ...QDialog(及其子类,以及所有Qt::Dialog类型的类)的对于其 parent 指针都有额外的解释:

    基本概念

    对话框是 GUI 程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。

    Qt 中使用QDialog类实现对话框。就像主窗口一样,我们通常会设计一个类继承QDialog。QDialog(及其子类,以及所有Qt::Dialog类型的类)的对于其 parent 指针都有额外的解释:如果 parent 为 NULL,则该对话框会作为一个顶层窗口,否则则作为其父组件的子对话框(此时,其默认出现的位置是 parent 的中心)。顶层窗口与非顶层窗口的区别在于,顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置。

    对话框分为模态对话框和非模态对话框。

    1. 模态对话框,就是会阻塞同一应用程序中其它窗口的输入。
      模态对话框很常见,比如“打开文件”功能。你可以尝试一下记事本的打开文件,当打开文件对话框出现时,我们是不能对除此对话框之外的窗口部分进行操作的。
    2. 与此相反的是非模态对话框,例如查找对话框,我们可以在显示着查找对话框的同时,继续对记事本的内容进行编辑。
      (下面更详细的示例)

    标准对话框

    所谓标准对话框,是 Qt 内置的一系列对话框,用于简化开发。事实上,有很多对话框都是通用的,比如打开文件、设置颜色、打印设置等。这些对话框在所有程序中几乎相同,因此没有必要在每一个程序中都自己实现这么一个对话框。
    Qt 的内置对话框大致分为以下几类:

    QColorDialog:		选择颜色;
    QFileDialog:			选择文件或者目录;
    QFontDialog:			选择字体;
    QInputDialog:		允许用户输入一个值,并将其值返回;
    QMessageBox:			模态对话框,用于显示信息、询问问题等;
    QPageSetupDialog:	为打印机提供纸张相关的选项;
    QPrintDialog:		打印机配置;
    QPrintPreviewDialog:打印预览;
    QProgressDialog:		显示操作过程。
    

    自定义消息框

    Qt 支持模态对话框和非模态对话框。
    模态与非模态的实现:


    • 使用QDialog::exec()实现应用程序级别的模态对话框
    • 使用QDialog::open()实现窗口级别的模态对话框
    • 使用QDialog::show()实现非模态对话框。

    模态对话框

    Qt 有两种级别的模态对话框:

    • 应用程序级别的模态
      当该种模态的对话框出现时,用户必须首先对对话框进行交互,直到关闭对话框,然后才能访问程序中其他的窗口。
    • 窗口级别的模态
      该模态仅仅阻塞与对话框关联的窗口,但是依然允许用户与程序中其它窗口交互。窗口级别的模态尤其适用于多窗口模式。
      一般默认是应用程序级别的模态。

    在下面的示例中,我们调用了exec()将对话框显示出来,因此这就是一个模态对话框。当对话框出现时,我们不能与主窗口进行任何交互,直到我们关闭了该对话框。

     	QDialog dialog;
        	dialog.setWindowTitle(tr("Hello, dialog!"));
    dialog.exec();
    

    非模态对话框

    下面我们试着将exec()修改为show(),看看非模态对话框:

      	QDialog dialog(this);
        	dialog.setWindowTitle(tr("Hello, dialog!"));
       	 	dialog.show();
    

    你会发现对话框竟然一闪而过!

    这是因为,show()函数不会阻塞当前线程,对话框会显示出来,然后函数立即返回,代码继续执行。
    注意,dialog 是建立在栈上的,show()函数返回,MainWindow::open()函数结束,dialog 超出作用域被析构,因此对话框消失了。知道了原因就好改了,我们将 dialog 改成堆上建立,当然就没有这个问题了:

    QDialog *dialog = new QDialog;
        dialog->setWindowTitle(tr("Hello, dialog!"));
        dialog->show();
    

    如果你足够细心,应该发现上面的代码是有问题的:dialog 存在内存泄露!dialog 使用 new 在堆上分配空间,却一直没有 delete。解决方案也很简单:将 MainWindow 的指针赋给 dialog 即可。

    QDialog *dialog = new QDialog(this);
        dialog->setWindowTitle(tr("Hello, dialog!"));
        dialog->show();
    

    不过,这样做有一个问题:如果我们的对话框不是在一个界面类中出现呢?由于QWidget的 parent 必须是QWidget指针,那就限制了我们不能将一个普通的 C++ 类指针传给 Qt 对话框。另外,如果对内存占用有严格限制的话,当我们将主窗口作为 parent 时,主窗口不关闭,对话框就不会被销毁,所以会一直占用内存。在这种情景下,我们可以设置 dialog 的WindowAttribute:

     	QDialog *dialog = new QDialog;
        	dialog->setAttribute(Qt::WA_DeleteOnClose);
        	dialog->setWindowTitle(tr("Hello, dialog!"));
        	dialog->show();
    

    setAttribute()函数设置对话框关闭时,自动销毁对话框。

    消息对话框

    查看帮助文档即可(实例中也有运用)

    标准文件对话框

    QFileDialog,也就是文件对话框。在本节中,我们将尝试编写一个简单的文本文件编辑器,我们将使用QFileDialog来打开一个文本文件,并将修改过的文件保存到硬盘。

    以上知识示例

    结果

    有很多,自己可以分步去去掉注释运行查看

    cpp

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QDebug>
    #include <QDialog>
    #include <QMessageBox>
    #include <QColorDialog>
    #include <QFileDialog>
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        //点击新建菜单项 弹出对话框
        connect(ui->actionNew,&QAction::triggered,this,[=](){
            //对话框  有两种
            // 模态对话框 (不可以对其他窗口进行操作) 非模态对话框 (可以对其他窗口操作)
        //        QDialog dlg(this);
        //        dlg.resize(200,100);
        //        dlg.exec(); //阻塞
    
        //        qDebug() << "弹出对话框!";
    
            //非模态对话框创建
             //QDialog dlg2(this); 创建到栈上 一闪而过
    //        QDialog * dlg2 = new QDialog(this);
    //        dlg2->resize(200,100);
    //        dlg2->show();
    //        //需要设置属性 dlg2   55号
    //        dlg2->setAttribute(Qt::WA_DeleteOnClose);
    
            //使用标准对话框  QMessageBox
            //错误对话框
            //QMessageBox::critical(this,"错误!","critical");
            //信息对话框
            //QMessageBox::information(this,"信息","info");
    
            //询问对话框
            // 参数1 、父亲 2、标题 3、提示内容  4 按键类型 5 关联回车按键
    //         if(QMessageBox::Save == QMessageBox::question(this,"问题","question",QMessageBox::Save | QMessageBox::Cancel,QMessageBox::Cancel))
    //         {
    
    //            qDebug() << "点击的是保存";
    //         }
    //         else
    //         {
    //            qDebug() << "点击的是取消";
    //         }
    
             //警告对话框
             // QMessageBox::warning(this,"警告!","warning");
    
            //选择颜色对话框
    //        QColor color =  QColorDialog::getColor(QColor(255,0,0));
    //        qDebug() << color.red() << color.green() << color.blue();
    
            //文件对话框
    //        QString path =  QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\zhangtao\\Desktop","(*.txt *.png)");
    //        qDebug() << path;
        });
    
    
    
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    

    文件小案例(保存于打开的设计)

    首先,我们需要创建一个带有文本编辑功能的窗口。借用我们前面的程序代码,应该可以很方便地完成:

    openAction = new QAction(QIcon(":/images/file-open"),tr("&Open..."), this);
    openAction->setStatusTip(tr("Open an existing file"));
    
    saveAction = new QAction(QIcon(":/images/file-save"), tr("&Save..."), this);
    saveAction->setStatusTip(tr("Save a new file"));
    
    QMenu *file = menuBar()->addMenu(tr("&File"));
    file->addAction(openAction);
    file->addAction(saveAction);
    
    QToolBar *toolBar = addToolBar(tr("&File"));
    toolBar->addAction(openAction);
    toolBar->addAction(saveAction);
    
    textEdit = new QTextEdit(this);
    setCentralWidget(textEdit);
    

    我们在菜单和工具栏添加了两个动作:打开和保存。接下来是一个QTextEdit类,这个类用于显示富文本文件。也就是说,它不仅仅用于显示文本,还可以显示图片、表格等等。不过,我们现在只用它显示纯文本文件。QMainWindow有一个setCentralWidget()函数,可以将一个组件作为窗口的中心组件,放在窗口中央显示区。显然,在一个文本编辑器中,文本编辑区就是这个中心组件,因此我们将QTextEdit作为这种组件。
    我们使用connect()函数,为这两个QAction对象添加响应的动作:

    connect(openAction, &QAction::triggered, 
    this, &MainWindow::openFile);
    connect(saveAction, &QAction::triggered, 
    this, &MainWindow::saveFile);
    

    ******下面是最主要的openFile()和saveFile()这两个函数的代码:

    //打开文件
    void MainWindow::openFile()
    {
        QString path = QFileDialog::getOpenFileName(this,
                   tr("Open File"), ".", tr("Text Files(*.txt)"));
        if(!path.isEmpty()) 
    {
            QFile file(path);
            if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) 
    {
                QMessageBox::warning(this, tr("Read File"),
                             tr("Cannot open file:\n%1").arg(path));
                return;
            }
            QTextStream in(&file);
            textEdit->setText(in.readAll());
            file.close();
        } 
    else 
    {
            QMessageBox::warning(this, tr("Path"),
                                 tr("You did not select any file."));
         }
    }
    
    //保存文件
    void MainWindow::saveFile()
    {
        QString path = QFileDialog::getSaveFileName(this,
                   tr("Open File"), ".", tr("Text Files(*.txt)"));
        if(!path.isEmpty()) 
    {
            QFile file(path);
            if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) 
    {
                QMessageBox::warning(this, tr("Write File"),
                             tr("Cannot open file:\n%1").arg(path));
                return;
            }
            QTextStream out(&file);
            out << textEdit->toPlainText();
            file.close();
        } 
    else 
    {
            QMessageBox::warning(this, tr("Path"),
                                 tr("You did not select any file."));
        }
    }
    

    在openFile()函数中,我们使用QFileDialog::getOpenFileName()来获取需要打开的文件的路径。这个函数原型如下:

    QString getOpenFileName(QWidget * parent = 0,
                            const QString & caption = QString(),
                            const QString & dir = QString(),
                            const QString & filter = QString(),
                            QString * selectedFilter = 0,
                            Options options = 0)
    

    注意,它的所有参数都是可选的,因此在一定程度上说,这个函数也是简单的。这六个参数分别是:

    • parent:父窗口。
      Qt 的标准对话框提供静态函数,用于返回一个模态对话框;
    • caption:对话框标题;
    • dir:对话框打开时的默认目录
      • “.” 代表程序运行目录
      • “/” 代表当前盘符的根目录(特指 Windows 平台;Linux 平台当然就是根目录),这个参数也可以是平台相关的,比如“C:\”等;
    • filter:过滤器。
      我们使用文件对话框可以浏览很多类型的文件,但是,很多时候我们仅希望打开特定类型的文件。比如,文本编辑器希望打开文本文件,图片浏览器希望打开图片文件。过滤器就是用于过滤特定的后缀名。如果我们使用“Image Files(.jpg .png)”,则只能显示后缀名是 jpg 或者 png 的文件。如果需要多个过滤器,使用“;;”分割,比如“JPEG Files(.jpg);;PNG Files(.png)”;
    • selectedFilter:默认选择的过滤器;
    • options:对话框的一些参数设定

    比如只显示文件夹等等,它的取值是enum QFileDialog::Option,每个选项可以使用 | 运算组合起来。
    QFileDialog::getOpenFileName()返回值是选择的文件路径。我们将其赋值给 path。通过判断 path 是否为空,可以确定用户是否选择了某一文件。只有当用户选择了一个文件时,我们才执行下面的操作。
    在saveFile()中使用的QFileDialog::getSaveFileName()也是类似的。使用这种静态函数,在 Windows、Mac OS 上面都是直接调用本地对话框,但是 Linux 上则是QFileDialog自己的模拟。这暗示了,如果你不使用这些静态函数,而是直接使用QFileDialog进行设置,那么得到的对话框很可能与系统对话框的外观不一致。这一点是需要注意的。

    展开全文
  • QDialog 简介

    万次阅读 2019-01-22 21:41:50
    QDialog类的子类主要有QMessageBox,QFileDialog,QColorDialog,QFontDialog,QInputDialog等,这些内容随后就会介绍到 QDialog类中的常用方法 方法 描述 setWindowTitle() 设置对话框...
  • Qt QDialog简介

    万次阅读 2019-09-21 11:17:18
    1、Qt中使用QDialog来实现对话框,QDialog继承自QWidget,对话框分为两种,一种是模态对话框、另一种是非模态对话框。即阻塞和非阻塞对话框,而模态对话框又有两种:应用程序级别的和窗口级别的,分别指完成对话框...
  • QDialog类参考

    2017-07-15 16:59:28
    QDialog类参考 QDialog类是对话框窗口的基类。 详情请见…… #include qdialog.h> 继承了QWidget。 被QColorDialog、QErrorMessage、QFileDialog、QFontDialog、QInputDialog、QMessageBox、QProgressDialog...
  • QDialog show

    2019-06-05 10:52:14
    QDialog类exec()与show()的区别
  • Qt开发:Qt Widgets模块——QDialog

    千次阅读 2019-05-13 15:02:22
    QDialog类是对话框窗口的基类。 头文件:#include <QDialog> qmake:QT += widgets 继承:QWidget 被继承:QColorDialog, QErrorMessage, QFileDialog, QFontDialog, QInputDialog, QMessageBox, ...
  • QT Creator 对话框QDialog

    2020-06-05 15:57:55
    QT Creator 对话框QDialog mainWindow.cpp 文件下: #include “mainwindow.h” #include “ui_mainwindow.h” #include //所有对话窗口类的基类 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ...
  • 使用 QDialog::exec()实现应用程序级别的模态对话框 使用 QDialog::open()实现窗口级别的模态对话框 使用 QDialog::show()实现非模态对话框。
  • QDialog *current_code_panel; } class test_code : public QDialog { Q_OBJECT public: explicit test_code(test_menu *parent=0); ~test_code(); } void test_menu::createCodePanel() { ...
  • QDialog无边框

    2021-06-07 17:59:47
    1.重写QDialog 二.代码 头文件 #ifndef MYDIALOG_H #define MYDIALOG_H #include <QDialog> class QPaintEvent; class QMouseEvent; class FramelessDialog : public QDialog { public: FramelessDialog...
  • PyQt5之QDialog对象

    千次阅读 2020-02-09 22:36:26
    简介 是对话窗口的基类,对话窗口是顶级窗口,主要...QDialog(parent: QWidget = None, flags: Union[Qt.WindowFlags, Qt.WindowType] = Qt.WindowFlags()) # 代码示例 window = QWidget() qd = QDialog(window) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,079
精华内容 6,831
关键字:

qdialog