• 【Qt】窗口部件 标准对话框


    目录

    三 窗口部件

    1.QWidget

    1.1 窗口与子部件

    2.QDialog

    2.1 模态和非模态对话框

    2.2 初始信号和槽并实现多窗口切换

    1) 定义信号和槽

    2) 自动定义对话框

    3) 标准对话框

    a.颜色对话框

    b.文件对话框

    c.字体对话框

    d.输入对话框

    e.消息对话框

    f.进度对话框

    g.错误消息对话框

    h.向导对话框

    *完整代码


    三 窗口部件

    1.QWidget

    widget:用户界面最基本的组成部分,它接收来自于windows系统的鼠标、键盘以及其他事件,然后将它自己绘制在屏幕上。

    • 分类:

    1.顶级widget:没有父类的独立窗口。

    2.子widget:作为子部件在父类中显示。

    3.复合型Widget:把一个widget作为一个容器来存放一组子widget。

    1.1 窗口与子部件

    • main.cpp

      #include 
      ​
      int main(int argc, char *argv[])
      {
          QApplication a(argc, argv);
      ​
          // 新建QWidget类对象,默认parent参数是nullptr,所以它是个窗口
          QWidget *widget = new QWidget();
          // 设置窗口标题
          widget->setWindowTitle(QObject::tr("我是widget"));
      ​
          // 新建QLabel对象,默认parent参数是nullptr,所以它是个窗口
          QLabel *label = new QLabel();
          label->setWindowTitle(QObject::tr("我是label"));
          // 设置要显示的信息
          label->setText(QObject::tr("label:我是个窗口"));
          // 改变部件大小,以便能显示出完整的内容
          label->resize(220, 20);
      ​
          // label2指定了父窗口为widget,所以不是窗口,只是widget窗口的子部件
          QLabel *label2 = new QLabel(widget);
          label2->setText(QObject::tr("label2:我不是独立窗口,只是widget的子部件"));
          label2->resize(250, 20);
          // 在屏幕上显示出来
          label->show();
          widget->show();
      ​
          int ret = a.exec();
          delete label;
          delete widget;
          return ret;
      }
    • .pro

      QT+=widgets
      ​
      SOURCES += \
          main.cpp

    2.QDialog

    2.1 模态和非模态对话框

    • 模块对话框:

      在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭。

      • //非模态对话框:
        //对话框弹出来,但mywidget窗口并没有出来
        ​
        #include"ui_widget.h"
        #include
        #include "widget.h"
        ​
        Widget::Widget(QWidget *parent)
            : QWidget(parent)
            , ui(new Ui::Widget)
        {
            ui->setupUi(this);
            //QDialog *dialog=new QDialog(this);
            //dialog->show();
            //或者
            QDialog dialog(this); //定义QDialog对象
            dialog.exec();
        }
        ​
        Widget::~Widget()
        {
            delete ui;
        }
    • 非模块对话框:

      对于非模态对话框,当被打开时,用户既可选择和该对话框进行交互,也可以选择同应用程序的其他窗口交互。

      • //模式对话框
        //对话框与widget一起出来
        #include "widget.h"
        #include
        #include"ui_widget.h"
        ​
        Widget::Widget(QWidget *parent)
            : QWidget(parent)
            , ui(new Ui::Widget)
        {
            ui->setupUi(this);
            QDialog *dialog=new QDialog(this);
            dialog->setModal(true);//表示是模式对话框
            dialog->show();
        }
        ​
        Widget::~Widget()
        {
            delete ui;
        }

    2.2 初始信号和槽并实现多窗口切换

    1) 定义信号和槽

    信号和槽都是函数,用于完成对象间的协同操作。

    • 步骤

      1.在widget.hMyWidget类定义中添加槽的声明。

      public slots: //槽一般用关键词slots修饰
          void showChildDialog();

      2.在widget.cpp中定义槽函数的功能。

      void MyWidget::showChildDialog()
      {
           QDialog *dialog=new QDialog(this);
           dialog->show();
      }

      3.在MyWidget类构造函数中,加入connect()函数将单击信号与槽关联。

      即受到指定信号后执行槽函数。

      MyWidget::MyWidget(QWidget*parent):
      QWidget(parent),
      ui(new Ui::MyWidget)
      {
           ui->setupUi(this);
           connect(ui->showChildButton,&QPushButton::clicked,
                  this,&MyWidget::showChildDialog);
      }

    2) 自动定义对话框

    #include "dialog.h"
    #include "./ui_dialog.h"
    ​
    Dialog::Dialog(QWidget *parent)
        : QDialog(parent)
        , ui(new Ui::Dialog)
    {
        ui->setupUi(this);
    }
    ​
    Dialog::~Dialog()
    {
        delete ui;
    }
    ​
    void Dialog::on_pushButton_clicked()
    {
        //accept是QDialog中的一个槽
        //功能:1.执行这个槽后隐藏这个模式对话框;2.返回QDialog::Accepted值
        accept();
    }
    ​
    void Dialog::on_pushButton_2_clicked()
    {
        //reject与accept对应
        //返回一个QDialog::Rejected值
        reject();
    }
    #ifndef DIALOG_H
    #define DIALOG_H
    #include 
    ​
    QT_BEGIN_NAMESPACE
    namespace Ui { class Dialog; }
    QT_END_NAMESPACE
    ​
    class Dialog : public QDialog
    {
        Q_OBJECT
    ​
    public:
        Dialog(QWidget *parent = nullptr);
        ~Dialog();
    ​
    private slots:
        void on_pushButton_2_clicked();
    ​
        void on_pushButton_clicked();
    ​
    private:
        Ui::Dialog *ui;
    };
    ​
    #endif // DIALOG_H
    #include "dialog.h"
    #include"QWidget"
    #include 
    ​
    ​
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Dialog dialog; //新建类对象
        if(dialog.exec()==QDialog::Accepted) //判断dialog执行结果
        {
            QWidget w;
            w.show(); //如果按下进入主界面按钮,则进入主界面
            return a.exec(); //程序正常运行
        }
        else
        {
            return 0; //退出程序
        }
    }

    3) 标准对话框

    a.颜色对话框

    //颜色对话框
    void Widget::on_pushButton_clicked()
    {
        QColor color=QColorDialog::getColor(Qt::red,this,tr("颜色对话框"));
        qDebug()<<"color:"< 
    

    b.文件对话框

    //文件对话框
    void Widget::on_pushButton_2_clicked()
    {
    //    //读取单个文件
    //    QString filename=QFileDialog::getOpenFileName(this,tr("文件对话框"),
    //                                                  "D:\photo",tr("图片文件(*.jpg *.png)"));
    //    qDebug()<<"fileName:"< 
    

    c.字体对话框

    //字体对话框
    void Widget::on_pushButton_3_clicked()
    {
        bool ok;//是否按下ok
        QFont font=QFontDialog::getFont(&ok,this);
        //如果按下ok,字体对话框按钮使用新字体
        //如果按下cancel,则输出信息
        if(ok)
        {
            ui->pushButton_3->setFont(font);
        }
        else
        {
            qDebug()< 
    

    d.输入对话框

    //输入对话框
    void Widget::on_pushButton_4_clicked()
    {
        bool ok;
        //获取字符串
        QString string=QInputDialog::getText(this,tr("输入字符串对话框"),
                                             tr("请输入用户名:"),QLineEdit::Normal,tr("admin"),&ok);
        if(ok)
        {
            qDebug()<<"string:"< 
    

    e.消息对话框

    //消息对话框
    void Widget::on_pushButton_5_clicked()
    {
        //问题对话框
        int ret1=QMessageBox::question(this,tr("问题对话框"),
                                       tr("你了解Qt吗?"),QMessageBox::Yes,QMessageBox::No);
        if(ret1==QMessageBox::Yes)
        {
            qDebug()< 
    

    f.进度对话框

    //进度对话框
    void Widget::on_pushButton_6_clicked()
    {
        QProgressDialog dialog(tr("文件复制进度"),tr("取消"),0,50000,this);
        dialog.setWindowTitle(tr("进度对话框"));
        dialog.setWindowModality(Qt::WindowModal);//将对话框设置为模态
        dialog.show();
        //演示复制进度
        for(int i=0;i<999999999;i++)
        {
            dialog.setValue(i);//设置进度条的当前值
            QCoreApplication::processEvents();//避免页面冻结
            if(dialog.wasCanceled())
            {
                break;
            }
            dialog.setValue(999999999);
            qDebug()< 
    

    g.错误消息对话框

    //错误消息对话框
    void Widget::on_pushButton_7_clicked()
    {
        errordlg->setWindowTitle(tr("错误信息对话框"));
        errordlg->showMessage(tr("这里是出错信息!"));
    }

    h.向导对话框

    //3个向导页面
    QWizardPage *Widget::createPage1()
    {
        QWizardPage *page=new QWizardPage;
        page->setTitle(tr("介绍"));
        return page;
    }
    QWizardPage *Widget::createPage2()
    {
        QWizardPage *page=new QWizardPage;
        page->setTitle(tr("用户信息选择"));
        return page;
    }
    QWizardPage *Widget::createPage3()
    {
        QWizardPage *page=new QWizardPage;
        page->setTitle(tr("结束"));
        return page;
    }
    //向导对话框
    void Widget::on_pushButton_8_clicked()
    {
        QWizard wizard(this);
        wizard.setWindowTitle(tr("向导对话框"));
        wizard.addPage(createPage1());//添加向导页面
        wizard.addPage(createPage2());
        wizard.addPage(createPage3());
        wizard.exec();
    }

    *完整代码

    #include "widget.h"
    #include "ui_widget.h"
    ​
    #include "QDebug"
    #include "QColorDialog"
    #include "QFileDialog"
    #include "QFontDialog"
    #include "QLineEdit"
    #include "QInputDialog"
    #include "QMessageBox"
    #include "QProgressDialog"
    #include "QErrorMessage"
    ​
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Widget)
    {
        ui->setupUi(this);
    ​
        errordlg=new QErrorMessage(this);
    }
    ​
    Widget::~Widget()
    {
        delete ui;
    }
    ​
    //颜色对话框
    void Widget::on_pushButton_clicked()
    {
        QColor color=QColorDialog::getColor(Qt::red,this,tr("颜色对话框"));
        qDebug()<<"color:"<pushButton_3->setFont(font);
        }
        else
        {
            qDebug()<setWindowTitle(tr("错误信息对话框"));
        errordlg->showMessage(tr("这里是出错信息!"));
    }
    ​
    //3个向导页面
    QWizardPage *Widget::createPage1()
    {
        QWizardPage *page=new QWizardPage;
        page->setTitle(tr("介绍"));
        return page;
    }
    QWizardPage *Widget::createPage2()
    {
        QWizardPage *page=new QWizardPage;
        page->setTitle(tr("用户信息选择"));
        return page;
    }
    QWizardPage *Widget::createPage3()
    {
        QWizardPage *page=new QWizardPage;
        page->setTitle(tr("结束"));
        return page;
    }
    //向导对话框
    void Widget::on_pushButton_8_clicked()
    {
        QWizard wizard(this);
        wizard.setWindowTitle(tr("向导对话框"));
        wizard.addPage(createPage1());//添加向导页面
        wizard.addPage(createPage2());
        wizard.addPage(createPage3());
        wizard.exec();
    }
    #ifndef WIDGET_H
    #define WIDGET_H
    ​
    #include 
    #include 
    #include 
    ​
    QT_BEGIN_NAMESPACE
    namespace Ui { class Widget;class QErrorMessage; }
    QT_END_NAMESPACE
    ​
    class Widget : public QWidget
    {
        Q_OBJECT
    ​
    public:
        Widget(QWidget *parent = nullptr);
        ~Widget();
    ​
    private slots:
        void on_pushButton_clicked();
    ​
        void on_pushButton_2_clicked();
    ​
        void on_pushButton_3_clicked();
    ​
        void on_pushButton_4_clicked();
    ​
        void on_pushButton_5_clicked();
    ​
        void on_pushButton_6_clicked();
    ​
        void on_pushButton_7_clicked();
    ​
        void on_pushButton_8_clicked();
    ​
    private:
        Ui::Widget *ui;
    ​
        QErrorMessage *errordlg;//错误消息对话框
    ​
        //向导对话框
        QWizardPage *createPage1();
        QWizardPage *createPage2();
        QWizardPage *createPage3();
    };
    #endif // WIDGET_H

  • 相关阅读:
    JAVA:实现合并已排序的单链表算法(附完整源码)
    Eclipse/IDEA常用快捷键
    考研:研究生考试(五天学完)之《线性代数与空间解析几何》研究生学霸重点知识点总结之第四课欧氏空间
    如何深入学习Java并发编程?
    怎样在应用中实现自助报表功能
    52、Flink 使用 Parametertool 获取应用参数代码示例
    【OS】 JAVA 管程 单消费者-生产者问题
    AnyCast技术
    安卓打开第三方应用失败
    CRC8校验算法源码——C语言版
  • 原文地址:https://blog.csdn.net/m0_61628700/article/details/130912797