.ui
![](https://i-blog.csdnimg.cn/blog_migrate/735a9e389f6cde152be9b108ffe8c44f.png)
这个也没什么好说的,多做做就是了
就是有一个点,在添加组件时,要初始化组件,如果输入中文没反应,那这个初始化组件其实是在初始化该组件的一个对象,对象不能有中文吧,要给组件写上名称,在右下角
![](https://i-blog.csdnimg.cn/blog_migrate/27dd77934afbf442a9af59b29a6face8.png)
actionNew
是该组件的对象的名,新建
是该组件的标题
资源文件
一般的软件,新建
选项的前面都有个图标吧,这是程序添加了图片文件
ui->actionNew->setIcon(QIcon("D:\\favicon.png"));
这样是可以的,但问题是,我这个软件一旦在别的计算机打开,actionNew
还能找到这个路径的图片吗?
显然是不能啊。所以Qt还增加了一个资源文件夹
项目文件02_QtRecoursesFile
,点击鼠标右键,Add New
![](https://i-blog.csdnimg.cn/blog_migrate/ae078e1614ba999f2e48b5eedde7e754.png)
要添加资源文件,对res.qrc
鼠标右击,Open in Editor
![](https://i-blog.csdnimg.cn/blog_migrate/13c420298f377e6e93d4cf5ec5d8b384.png)
一般来说,要添加的资源文件都放在项目的目录下
其中,Add Prefix
是创建前缀,Add Files
是添加文件,先创建前缀,再在相应的前缀下添加文件,其实就是给你添加的资源文件进行分类,但不会另外创建文件夹,相当于打上了标记,所以为了项目的目录下不会一团乱,资源文件需要自行分类并放进相应的文件夹中
![](https://i-blog.csdnimg.cn/blog_migrate/17a33e03a48ce84f039648bff99059e9.png)
其中favicon.png
是放在项目目录下的一个picture
文件中,而.jpg
和Tom.jpg
是直接放在项目目录下,favicon.png
和Tom.jpg
是添加了/pic
前缀,.jpg
添加了/
前缀
然后也很明显可以看出不同的地方,同在/pic
前缀下的两张图片,名字其实是不一样的,picture/favicon.png
多了文件夹的名称,这在代码中使用资源文件,就是用这个完整的名称
资源文件的使用方法 —— :
+ 前缀名
+ /文件名
ui->actionNew->setIcon(QIcon(": /pic /picture/favicon.png"));
ui->actionopen->setIcon(QIcon(": / /.jpg"));
这里还是说一下斜线和反斜线吧,
\
这是反斜线,如果在代码中要写路径,用反斜线分割,那就还需要再补充一个反斜线,对后面的反斜线进行转义;而这个/
是斜线,代码中写路径就可以直接用
D:\\favicon.png
或者D:/favicon.png
而一般Windows的文件夹,都是用反斜线分割的
对话框
对话框分为两种,模态和非模态,前者打开后无法操作其他窗口,后者可以
// 模态
QDialog dig(this) ;
dig.resize(200,400);
dig.exec(); // 阻塞功能 不会一闪就退出
qDebug()<<"弹出对话框"; // main()函数中return exec();
// 非模态
QDialog dia3(this);
dia3.resize(400,200);
dia3.show();
// 有点神奇 为什么new就不会一闪而过
//如果只是创建QDialog的对象 就会一下子执行完程序然后释放
QDialog *dig2 = new QDialog(this);
dig2->resize(200,400);
dig2->show();
dig2->setAttribute(Qt::WA_DeleteOnClose,true);
// 设置属性attribute 点击close后delete释放对象的标号是55
connect(ui->actionNew,&QAction::triggered,this,[=](){
QDialog *dig2 = new QDialog(this);
dig2->resize(200,400);
dig2->show();
dig2->setAttribute(Qt::WA_DeleteOnClose,true);
// 因为dig2是依赖在QMainWindow上的 但关闭对话框 又不是关闭窗口
// 所以不设置属性的话是不会释放dig2这个对象的
// 来回关闭创建多了 就会占满内存
});
QMessageBox
标准对话框
Qt
提供了几个QMessageBox
的静态成员函数,可以直接通过类名调用,也可以通过实例化的对象调用
QMessageBox::critical(this,"标题","内容");
QMessageBox::about(this,"标题","内容");
QMessageBox::aboutQt(this,"关于Qt!!!!!!!!!!!");
![](https://i-blog.csdnimg.cn/blog_migrate/c82bb1460c4a5863f30a4736bdb8a9a1.png)
其中有一个对话框
QMessageBox::question(this,"提问","ques");
默认是两个按钮,Yes
和 No
再看看question
这个函数的第四个参数QMessageBox::StandardButtons buttons = StandardButtons(Yes | No)
类型是StandardButtons
的按钮,且缺省值是Yes | No
那我们就可以自主传入参数,在文档中搜一下QMessageBox::StandardButtons
enum
是枚举类型,就是可以拿来直接用
![](https://i-blog.csdnimg.cn/blog_migrate/62cac513eddf8769aa471661bd71aad2.png)
传入参数
QMessageBox::question(this,"提问","ques",QMessageBox::Save|QMessageBox::Cancel);
按钮就变了
然后再看看question
的第5个参数QMessageBox::StandardButton defaultButton = NoButton
是默认选中,默认关联回车键的按钮,看Save
按钮,是蓝边,敲回车就表示按Save
按钮
QMessageBox::question(this,"提问","ques",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel);
再看看这个函数的返回值,是QMessageBox::StandardButton
,所以如果要接收判断用户按的是Save
还是Cancel
,可以用==
判断
if(QMessageBox::Save==QMessageBox::question(this,"提问","ques",QMessageBox::Save|QMessageBox::Cancel))
{
qDebug()<<"保存";
}else
{
qDebug()<<"取消";
}
文件对话框
#include <QFileDialog>
QFileDialog::getOpenFileName(this,"文件对话框","C:\\Users\\Fighting\\Desktop","(*.doc)");
第三个参数,默认是项目的路径;第四个参数是过滤不是.xx
后缀的文件,但不会过滤文件夹
这个函数返回类型是QString
QString file = QFileDialog::getOpenFileName(this,"文件对话框","C:\\Users\\Fighting\\Desktop","(*.docx)");
if(file!=nullptr) qDebug()<<file;
颜色选择对话框
#include <QColorDialog>
QColor color = QColorDialog::getColor();
qDebug()<<color.red()<<" "<<color.green()<<" "<<color.blue();
多的也懒得说了,文档都有
字体对话框
#include <QFontDialog>
bool ok;
QFont font = QFontDialog::getFont(&ok,QFont("微软雅黑",20));
qDebug()<<font;
qDebug()<<font.family().toUtf8().data()<<" "<<font.pointSize()<<" ";
也没啥好说的,文档都有