标签搜索

目 录CONTENT

文章目录

对话框.md

小小城
2021-08-22 / 0 评论 / 0 点赞 / 2 阅读 / 5,500 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-05-02,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

对话框

@[toc]

一、模态和非模态对话框

1.概念

  •  模态对话框是指在没有关闭它之前,不能再与同一个应用程序的其他窗口进行交互,比如新建项目时弹出的对话框。
  •  非模态对话框是指既可以和它交互,也可以与同一程序中的其他窗口交互,如word中查找替换对话框。

2.创建菜单栏

 QMenuBar* mBar = menuBar();
    setMenuBar(mBar);

3.创建菜单项

QMenu* menu = mBar->addMenu("dui hua kuang");

4.创建模态对话框
triggered信号:

[signal] void QAction::triggered(bool checked = false)

作用:当用户激活某个操作时发出此信号;例如,当用户单击菜单选项、工具栏按钮或按下操作的快捷键组合时,或者当调用trigger()时。

 QAction* p1 = menu->addAction("mo tai dui hua kuang");
    connect(p1,&QAction::triggered,[=]()
    {
        QDialog dig;
        dig.exec();
        qDebug()<<"after QDialog";
    });

模态对话框会执行dig.exec();,然后整个程序都阻塞在这行代码处,等待用户对模态对话框的操作,所以模态对话框出现时只能操控自己一个对话框,当窗口关闭时才会执行到qDebug()<<"after QDialog";

5.创建非模态对话框
setAttribute函数

void QWidget::setAttribute(Qt::WidgetAttribute attribute,
											 bool on = true)

作用:如果on为真,则设置此小部件上的attribute属性;否则清除属性。
attribute属性:Qt::WA_DeleteOnClose,让Qt在小部件接受关闭事件时删除此小部件

QAction* p2 = menu->addAction("fei mo tai dui hua kuang");
    connect(p2,&QAction::triggered,[=]()
    {
    	//QDialog dig;
        //dig.show();
    	
        //QDialog* dig = new QDialog(this);
        //dig->show();

        QDialog* dig = new QDialog;
        dig->setAttribute(Qt::WA_DeleteOnClose);
        dig->show();
        
        qDebug()<<"after QDialog";
    });

你会发现非模态对话框当中没有exec,只是一个简单的show,也就代表程序不会阻塞在这里,那么dig又是一个局部变量,出了这个作用域变量就销毁了,所以当程序运行时你并不会看到非模态对话框出现,解决这个问题有很多种方式:

  •  把dig作为类的成员
  •  为dig动态非配空间并指定父对象,然后销毁时有对象树销毁。缺点当重复触发信号时,每次触发都要在堆上开辟空间,会造成内存浪费
  •  创建dig时不指定父对象,销毁时采用setAttribute函数,在界面关闭时自动销毁

二、标准对话框和文件对话框

1.创建对话框

//头文件
#include <QMessageBox>

about函数:

void about(QWidget *parent, const QString &title, const QString &text)

参数:

  •  QWidget *parent指定父对象
  •  const QString &title对话框的标题
  •  const QString &text对话框的内容

作用自动创建一个对话框

QAction* p3 = menu->addAction("guan yu dui hua kuang");
    connect(p3,&QAction::triggered,[=]()
    {
        QMessageBox::about(this,"about","guan yu QT");
    });

2. 创建问题对话框

question函数:

[static] int QMessageBox::question(QWidget *parent, const QString 
&title, const QString &text, int button0, int button1 = 0, int button2 = 0)

参数:

  •  QWidget *parent指定父对象
  •  const QString &title对话框的标题
  •  const QString &text对话框中的内容
  •  int button0自定义按钮,不用默认提供的按钮

返回值为你具体按下的按钮
作用创建一个问题对话框

QAction* p4 = menu->addAction("wen ti dui hua kuang");
    connect(p4,&QAction::triggered,[=]()
    {
        int ret = QMessageBox::question(this,"question","you ren ma?",QMessageBox::Ok,QMessageBox::Cancel,QMessageBox::No);
        switch(ret)
        {
            case QMessageBox::Ok:
                qDebug()<<"i am ok";
            break;

        case QMessageBox::No:
            qDebug()<<"i am no";
            break;

        case QMessageBox::Cancel:
            qDebug()<<"i am Cancel";
            break;

        default:
            break;
        }
    });

3.创建文件对话框

//头文件
#include <QFileDialog>

getOpenFileName函数

[static] QString QFileDialog::getOpenFileName(QWidget *parent = 
Q_NULLPTR, const QString &caption = QString(), const QString &dir = 
QString(), const QString &filter = QString(), QString *selectedFilter 
= Q_NULLPTR, Options options = Options())

参数:

  •  QWidget *parent = Q_NULLPTR指定父对象
  •  const QString &caption = QString()文件对话框的名字
  •  const QString &dir = QString()打开文件的路径
  •  const QString &filter = QString()代表打开文件的格式,起到过滤的作用

返回值:返回一个文件的完整路径

QAction* p5 = menu->addAction("wen jian dui hua kuang");
    connect(p5,&QAction::triggered,[=]()
    {
        QString path = QFileDialog::getOpenFileName(this,"open","../","souce(*.cpp *.h);;Text(*.txt);;all(*.*)");
        qDebug()<<path;
    });

三、完整代码

MainWindow.cpp:

#include "mainwindow.h"
#include <QMenuBar>//菜单栏
#include <QMenu>//菜单
#include <QDebug>//输出
#include <QAction>//菜单项
#include <QPushButton>//按钮
#include <QDialog>//对话框
#include <QMessageBox>//问题对话框
#include <QFileDialog>//文件对话框


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    resize(500,500);//调整主窗口的大小
    
    QMenuBar* mBar = menuBar();//创建一个菜单栏
    setMenuBar(mBar);//将主窗口的菜单栏设置为menBar
    
    QMenu* menu = mBar->addMenu("dui hua kuang");//为菜单栏创建菜单

    QAction* p1 = menu->addAction("mo tai dui hua kuang");//为菜单创建菜单相
    
    connect(p1,&QAction::triggered,[=]()//为菜单项关联动作
    {
        QDialog dig;//创建模态对话框
        dig.exec();//就算是局部变量dig也会因为exec而阻塞在这里
        qDebug()<<"after QDialog";
    });

    QAction* p2 = menu->addAction("fei mo tai dui hua kuang");//为菜单栏添加菜单项
    connect(p2,&QAction::triggered,[=]()//为菜单项关联动作
    {
        //QDialog dig;
        //dig.show();

        //QDialog* dig = new QDialog(this);
        //dig->show();

        QDialog* dig = new QDialog;//创建非模态对话框
        dig->setAttribute(Qt::WA_DeleteOnClose);//在对话框关闭时自动销毁dig
        dig->show();//这里只是show,如果是局部变量必须动态分配空间
        qDebug()<<"after QDialog";
    });

    QAction* p3 = menu->addAction("guan yu dui hua kuang");//为菜单创建菜单项
    connect(p3,&QAction::triggered,[=]()//为菜单项关联动作
    {
        QMessageBox::about(this,"about","guan yu QT");//只是简单的弹出一个对话框
    });

    QAction* p4 = menu->addAction("wen ti dui hua kuang");//创建菜单项
    connect(p4,&QAction::triggered,[=]()//关联动作
    {
    	//创建问题对话框,并自定义按钮,
        int ret = QMessageBox::question(this,"question","you ren 
        ma?",QMessageBox::Ok,QMessageBox::Cancel,QMessageBox::No);
        //返回值代表用户具体按下的按钮
        switch(ret)
        {
            case QMessageBox::Ok:
                qDebug()<<"i am ok";
            break;

        case QMessageBox::No:
            qDebug()<<"i am no";
            break;

        case QMessageBox::Cancel:
            qDebug()<<"i am Cancel";
            break;

        default:
            break;
        }
    });

    QAction* p5 = menu->addAction("wen jian dui hua kuang");//创建菜单项
    connect(p5,&QAction::triggered,[=]()//关联动作
    {
    	//创建文件对话框,注意打开文件的格式
    	//"souce(*.cpp *.h);;Text(*.txt);;all(*.*)");
    	//*.cpp和*.h之间有空格,两个;;,具体请按F1查看man
        QString path = QFileDialog::getOpenFileName(this,"open","../",
        "souce(*.cpp *.h);;Text(*.txt);;all(*.*)");
        
        qDebug()<<path;
    });

}

MainWindow::~MainWindow()
{

}

0

评论区