对话框
@[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()
{
}
评论区