QT学习(九)——对话框
任然需要以QMainWindows为基类文件项目
为了方便理解,我把dialog.cpp文件的各个部分拆开解读。
----------------------------------------------------------------------
模态对话框
模态对话框就是,当我打开模态对话框的时候,在我对模态对话框操作完成之前,我无法对他的主窗口进行操作,这里主要是使用exec()函数来进行消息循环,在循环结束之前,只能对当前窗口操作。
//模态对话框
connect(p1,&QAction::triggered,
[=]()
{
QDialog ui;
ui.resize(300,300);
ui.setWindowTitle("模态对话框");
ui.exec();//程序运行到这里会循环直到关闭,才会打印下面的话
qDebug()<<"模态对话框被关闭!!";
});
运行:
在我关闭“模态对话框”之前,我无法对主窗口操作。
--------------------------------------------------------------------
非模态对话框
非模态对话框就是,当我打开非模态对话框的时候,在我对非模态对话框操作完成之前,我可以对他的主窗口进行操作,这里主要是使用show()函数来进行对话框的显示,在当前窗口被关闭之前,可以对其他窗口操作。
//非模态对话框
connect(p2,&QAction::triggered,
[=]()
{
/*ui.resize(300,300);
ui.setWindowTitle("非模态对话框");
ui.show();
qDebug()<<"模态对话框被启用!!";//非模态的对话框一旦被启用就会打印这句话,因为没有消息循环*/
//如果不想使用类成员变量使用指针分配空间也是可以的
/*QDialog*wo;
wo=new QDialog(this);//记住!只有指定了父对象才能在程序结束的时候自动回收这一部分的空间
wo->resize(300,300);
wo->setWindowTitle("非模态对话框");
wo->show();*/
//这种指针方法不好的地方在于,非模态的对话框的内存只有在程序运行结束的时候才会释放空间,如果在程序运行的时候多次点击按钮,那么内存会越变越少,不建议使用
//如果一定要使用指针的话,不要指示父对象
QDialog*wo;
wo=new QDialog;//记住!只有指定了父对象才能在程序结束的时候自动回收这一部分的空间
wo->resize(300,300);
wo->setWindowTitle("非模态对话框");
wo->setAttribute(Qt::WA_DeleteOnClose);//这一句代码可以让对话框在关闭的时候就释放空间
wo->show();
});
运行:
如图,当我把鼠标放在主窗口上时,主窗口做出了反应。
而且有三种创建非模态对话框的方式:
1.成员变量——十分简单的方式
2.局部指针变量,new开辟空间,并指定主窗口为父窗口——这样会有弊端,非模态的对话框的内存只有在程序运行结束的时候才会释放空间,如果在程序运行的时候多次点击按钮,那么内存会越变越少,不建议使用
3.局部指针变量,new开辟空间,但是不指定主窗口为父窗口——这样做就可以解决第二种方法的弊端,使用 wo->setAttribute(Qt::WA_DeleteOnClose) 函数,在传参的时候,可以按F1查看文档来传参,这样就可以让对话框在关闭的时候就释放空间。
-------------------------------------------------------------------------------------
关于对话框
//关于对话框
QAction*lol=menu->addAction("关于对话框");
connect(lol,&QAction::triggered,
[=]()
{
QMessageBox::about(this, //关于对话框的父对象,表示关于对话框显示在父对象的上面
"关于对话框", //关于对话框的标题
"这就是关于对话框!!牛逼嗷!" //关于对话框的内容
);
});
运行:
-------------------------------------------------------------------------------------------------
问题对话框
//问题对话框
QAction*pdd=menu->addAction("问题对话框");
connect(pdd,&QAction::triggered,
[=]()
{
int res=QMessageBox::question(this,"问题","你好看吗?"
,QMessageBox::Ok|QMessageBox::Ignore);//第四个参数可以自定义的修改问题框的选项
switch (res)
{
/*case QMessageBox::Yes:
qDebug()<<"我很好看!!";
break;
case QMessageBox::No:
qDebug()<<"我很丑,但是我很温柔!";
break;
default:
break;*/
case QMessageBox::Ok:
qDebug()<<"我很好看!!";
break;
case QMessageBox::Ignore:
qDebug()<<"问我这个问题,您配吗?";
break;
default:
break;
}
});
运行:
QMessageBox::question 函数
1.它的第四个参数是可以改变按钮的内容的;
2.该函数返回值是枚举类型,可以使用int类型来获取返回值,从而得知用户所点击的按钮,并作出相应操作。
比如我这段代码,如果不更改按钮,那么就是“Yes”和“No”这两个按钮,
但是我把按钮改成了“Ok”“Ignore”这两个按钮,根据返回值可以打印不同语句。
-------------------------------------------------------------------------------
文件对话框
//文件对话框
QAction*file=menu->addAction("文件对话框");
connect(file,&QAction::triggered,
[=]()
{
//该函数返回的是一个字符串,就是打开文件的路径名称
QString path=QFileDialog::getOpenFileName(this,"文件对话框",
"../",
"souce(*.cpp *.h);;"
"Text(*.txt);;"
"all(*.*)"
);//第四个参数是用来筛选文件类型的参数,也可以这样写 "souce(*.cpp *.h);;Text(*.txt);;all(*.*)"
qDebug()<<path;
});
运行:
当我点击进去一个文件夹,此时限制文件类型只能为souce(*.cpp *.h)
解除限制,可以读取全部文件
关于QFileDialog::getOpenFileName函数,该函数返回的是一个字符串,该字符串是所选取文件的路径。
第三个参数我有点懵逼,第四个参数是是用来筛选文件类型的参数,有代码注释中的两种写法。
---------------------------------------------------------------------------------------------------------
粘贴dialog.cpp文件中的全部代码:
#include "dialog.h"
#include<QMenu>
#include<QMenuBar>
#include<QAction>
#include<QDialog>//模态与非模态对话框头文件
#include<QDebug>
#include<QMessageBox>//对话弹框头文件
#include<QFileDialog>//文件对话框
Dialog::Dialog(QWidget *parent)
: QMainWindow(parent)
{
resize(500,500);
QMenuBar*mBar=menuBar();
setMenuBar(mBar);//设定菜单栏
QMenu*menu=mBar->addMenu("对话框");
QAction*p1=menu->addAction("模态对话框");
//模态对话框
connect(p1,&QAction::triggered,
[=]()
{
QDialog ui;
ui.resize(300,300);
ui.setWindowTitle("模态对话框");
ui.exec();//程序运行到这里会循环直到关闭,才会打印下面的话
qDebug()<<"模态对话框被关闭!!";
});
QAction*p2=menu->addAction("非模态对话框");
//非模态对话框
connect(p2,&QAction::triggered,
[=]()
{
/*ui.resize(300,300);
ui.setWindowTitle("非模态对话框");
ui.show();
qDebug()<<"模态对话框被启用!!";//非模态的对话框一旦被启用就会打印这句话,因为没有消息循环*/
//如果不想使用类成员变量使用指针分配空间也是可以的
/*QDialog*wo;
wo=new QDialog(this);//记住!只有指定了父对象才能在程序结束的时候自动回收这一部分的空间
wo->resize(300,300);
wo->setWindowTitle("非模态对话框");
wo->show();*/
//这种指针方法不好的地方在于,非模态的对话框的内存只有在程序运行结束的时候才会释放空间,如果在程序运行的时候多次点击按钮,那么内存会越变越少,不建议使用
//如果一定要使用指针的话,不要指示父对象
QDialog*wo;
wo=new QDialog;//记住!只有指定了父对象才能在程序结束的时候自动回收这一部分的空间
wo->resize(300,300);
wo->setWindowTitle("非模态对话框");
wo->setAttribute(Qt::WA_DeleteOnClose);//这一句代码可以让对话框在关闭的时候就释放空间
wo->show();
});
//关于对话框
QAction*lol=menu->addAction("关于对话框");
connect(lol,&QAction::triggered,
[=]()
{
QMessageBox::about(this, //关于对话框的父对象,表示关于对话框显示在父对象的上面
"关于对话框", //关于对话框的标题
"这就是关于对话框!!牛逼嗷!" //关于对话框的内容
);
});
//问题对话框
QAction*pdd=menu->addAction("问题对话框");
connect(pdd,&QAction::triggered,
[=]()
{
int res=QMessageBox::question(this,"问题","你好看吗?"
,QMessageBox::Ok|QMessageBox::Ignore);//第四个参数可以自定义的修改问题框的选项
switch (res)
{
/*case QMessageBox::Yes:
qDebug()<<"我很好看!!";
break;
case QMessageBox::No:
qDebug()<<"我很丑,但是我很温柔!";
break;
default:
break;*/
case QMessageBox::Ok:
qDebug()<<"我很好看!!";
break;
case QMessageBox::Ignore:
qDebug()<<"问我这个问题,您配吗?";
break;
default:
break;
}
});
//文件对话框
QAction*file=menu->addAction("文件对话框");
connect(file,&QAction::triggered,
[=]()
{
//该函数返回的是一个字符串,就是打开文件的路径名称
QString path=QFileDialog::getOpenFileName(this,"文件对话框",
"../",
"souce(*.cpp *.h);;"
"Text(*.txt);;"
"all(*.*)"
);//第四个参数是用来筛选文件类型的参数,也可以这样写 "souce(*.cpp *.h);;Text(*.txt);;all(*.*)"
qDebug()<<path;
});
}
运行: