目录
在创建文件中,输入类信息时,基类要选择QDialog类,表明该类继承自QDialog类,使用这个类可以生成一个对话框界面。
3:创建一个简单的HelloWorld文件时,对于生成的左侧目录里面的文件进行说明:
4:运行生成的文件夹中的.exe文件时报错,报缺少.dll结尾的文件,怎么解决?
11:设置窗口状态的函数: setWindowState()
16:网格布局函数gridLayout函数和设置间距的方法:
17:在设计界面时,用网格布局的时候,会碰见自己设计的按钮/标签的大小不符合自己的心意,那么应该怎么处理呢?
19:在Qt中,用QLineEdit文本里面设置了一个数字,然后在两边设置了“+”和“-”按钮,怎么用这两个按钮控制文本里面的数字,对数字进行加减呢?
20: 给了一个按钮,一个LineEdit文件框,怎么点击一下按钮,文本框内的数字自动增加呢?
21:在想用lambda表达式的connect情况下,怎么做到多界面的参数传递呢?
23:设置了一个按钮后,并对按钮进行了命名,怎么把按钮上面文字的位置进行设置呢?
24: 自己设计了一个界面,有多个按钮,怎么在页面点击按钮后,原来设计的清空,变成自己点击按钮后的新页面呢《=》等同于怎么清空页面呢。
25:在用水平和垂直布局的时候,遇到里面设置的控件位置得不到自己想要,用了Qt:Align...都解决不了,现在有一种方式,能很好的解决问题。方式如下:
26:设置字体大小函数setPointSize()和像素大小 函数setPixelSize()的区别
28 qt中msleep、sleep、usleep函数的简单介绍
29 Qt中的显示函数show()和exec()函数的简单介绍:
1:QDialog类说明
在创建文件中,输入类信息时,基类要选择QDialog类,表明该类继承自QDialog类,使用这个类可以生成一个对话框界面。
2:快捷键说明:
Ctrl + + :放大字体
Ctrl + - : 缩小字体
Ctrl + 0 :字体还原到默认的大小
Ctrl + R : 运行程序
Ctrl + S : 保存文件
Alt + 4 :显示编译输出信息
Ctrl + 空格 :强制代码补全
Ctrl + 2 :回到编辑模式
Ctrl + Shift + B : 构建工程
Ctrl + 5 : 进入项目模式
F5 : 调试
Alt + Enter键 : 弹出建联菜单
Ctrl + Shift + R : 出现替换栏
Ctrl + L : 对主界面进行垂直布局管理
Ctrl + K : 就会在定位器中显示各个过滤器的前缀及其功能
3:创建一个简单的HelloWorld文件时,对于生成的左侧目录里面的文件进行说明:
说明:
文件 说明 helloworld.pro 该文件是项目文件,其中包含了项目相关信息 helloworld.pro.user 该文件包含了与用户有关的项目信息 hellodialog.h 该文件是新建的HelloDialog类的头文件 hellodialog.cpp 该文件是新建的HelloDialog类的源文件 main.cpp 该文件中包含了main()主函数 hellodialog.ui 该文件是设计师设计的界面对应的界面文件
4:运行生成的文件夹中的.exe文件时报错,报缺少.dll结尾的文件,怎么解决?
解决方法:
一:将安装文件夹目录里面的bin文件夹中,把缺少的文件复制到需要运行的debug文件夹中。
二:将安装目录中的bin文件夹中路径,保存到环境变量中,方便运行时,自动查找文件路径。
5:程序编写好后,怎样发布到让别人电脑上面运行呢?
两种方式:
一:可以在桌面上新建一个文件夹,重命名为“我的第一个Qt程序”,然后将release文件夹中的helloworld.exe复制过来,再去Qt安装目录的 bin目录中将 libgce_s_dw2-l.dll,libstdc十十-6.dll,libwinpthread-l.dll,Qt5Core.dll,Qt5Gui.dll和 Qt5Widgets.dll这6个文件复制过来另外,还需要将安装目录中的5.6mingw49_32\plugins目录中的platforms 文件夹复制过来(不要修改该文件夹名称),里面只需要保留 qwindows.dll 文件即可。然后对其压缩,传送给别人即可。
二:可以在桌面上新建一个文件夹,重命名为“我的第一个Qt程序”,然后将release文件夹中的helloworld.exe复制过来,再在这个文件夹内按住shift健加上鼠标右击,打开该文件下的Powershell窗口,然后运行 windeployqt helloworld.exe即可完成打包。(注意:windeployqt 工具会将所有可用的文件都复制过来,有些可能是现在并不需要的,所以建议一般情况下不要使用,只有在无法确定程序依赖的文件时再使用该工具。)
6:设置应用程序的图标:
1:首先在图标之家, 桌面图标,ICO,PNG图标,网页图标免费下zh 这个网站中下载自己想要的.ico结尾的图标,下载到自己电脑的桌面上,命名为:myico.ico
2: 将桌面的myico.ico文件复制到自己helloworld项目文件中。
3:打开helloworld.pro文件,在最后面添加下面一行代码:
RC_ICONS = myico.ico
4:点击运行后,打开realease文件,发现自己的.exe文件图标变成了自己下载的那个
7:在Qt Creator 中用纯代码编写程序
1:重新创建文件夹,选择其他项-----》选择空项目
2:在helloworld.pro中添加代码
//如果Qt 主版本大于4(也就是说当前使用的是 Qt5或者更高版本),则需要添加 widgets 模块 greaterThan(QT_MAJOR_VERSION,4): QT += widgets
3:创建一个源文件,命名为main.cpp,填写代码为:
#include<QApplication> #include<QDialog> #include<QLabel> //前3行是头文件包含。Qt 中每一个类都有一个与其同名的头文件; //因为后面用到了QApplication,QDialog和 QLabel这3个类,所以这里要包含这些类的定义。 int main(int argc, char *argv[]) //C+十中最常见到的 main()函数,它有两个参数,用来接收命令行参数 { //新建了QApplication类对象,用于管理应用程序的资源,任何一个Qt Widgets程序都要有一个QApplication 对象。 //因为Qt程序可以接收命令行参数,所以它需要argc和argv两个参数。 QApplication a(argc,argv); //新建了一个QDialog 对象,QDialog类用来实现一个对话框界面 QDialog w; //设置对话框的宽和高 w.resize(400,300); //新建了一个 QLabel对象,并将 QDialog 对象作为参数,表明了对话框是它的父窗口 //也就是说这个标签放在对话框窗口中。 QLabel label(&w); //移动对话框的位置 label.move(120,120); //给标签设置要显示的字符第10行让对话框显示出来。 //QObject::tr()函数可以实现多语言的实现 label.setText(QObject::tr("Hello World! 你好 Qt!")); //在默认情况下,新建的可视部件对象都是不可见的,要使用show()函数让它们显示出来 w.show(); //让QApplication 对象进人事件循环,这样当Qt 应用程序运行时便可以接收产生的事件 return a.exec(); }
8:查看想要查询的函数或者类名的方法:
将鼠标指针放到一个类名或函数上,则出现一个提示框显示其简单介绍。这时按下F1键就可以在编辑器右边快速打开其帮助文档。
9:引用头文件时,用<>和“”分别代表了什么意思?
用<>代表的意思是:
系统会到默认目录(编译器及环境变量、项目文件所定义的头文件寻找目录,包括 Qt安装的include目录。这是标准方式。
用双引号“”的意思是:
系统先到用户当前目录(即项目目录)中查找要包含的文件,找不到再按标准方式查找。
10:做项目工程中,日常碰到的错误解决方法:
1:运行项目时,会有“QApplication: No such file or directory ”的报错信息?
------解决方法:在项目里面的.pro文件中添加一行代码:
greaterThan(QT_MAJOR_VERSION,4): QT += widgets
2:出现“error: invalid operands of types '<unresolved overloaded function type>' and 'const char [8]' to binary 'operator<<' ”的报错信息?
------解决方法:出错的那行代码中,一个函数少加了括号。如下:
3:出现“error : cannot convert 'QTextBlock' to 'QTextFrame*' in initialization
QTextFrame * childFrame = it.currentBlock();”的报错信息?-------解决方法:在报出错误的那一行代码中,一个函数写错了;订正如下:
QTextFrame *childFrame = it.currentFrame(); //是currentFrame(),不是currentBlock()
4: qt进行编译时,发生“error while building/deploying project....”的错误。
-------解决方法:
a.路径中含有中文名:
常见的就是项目拖到桌面,直接打开pro文件,如果 路径中有中文名,就会报错。
b.编译器选择了select all:
在打开项目选择编译器的界面,选择了安装的多个编译器。5:报错好几个,比如有这些错误时,error:cannot initialize object parameter of type 'QWidget' with an expression of type 'MainWindow';error:no matching member function for call to 'connect';error:no matching constructor for initialization of ...
-------解决方法:
这些错误其实是版本冲突造成的,为了避免这些错误。在qt界面中,点击:帮助-》关于插件-》选择C++里面的ClangCodeModel->取消勾选-》重启即可。
6:报错:“DX9 Overlay is DISABLED”?
-----解决方法:
问题是Nvidia驱动496.13的问题,只要切换到旧版本就行啦。
8:报错:“QLayout: Attempting to add QLayout ““ to MainWindow ““, which already has a layout”。
----解决方法:其实是自己新建的对象缺乏了指针的问题。
比如:我的代码是:
QGridLayout myLayout = new QGridLayout (this);
这是时候就报错了,报错为:
conversion from “QGridLayout” to non-scalar type 'QGridLayout' requested
原因是myLayout缺乏指针,需要把变量声明为指针类型。
改正代码如下:
QGridLayout *myLayout = new QGridLayout (this);
9:报错信息:“QLayout: Attempting to add QLayout ““ to MainWindow ““, which already has a layout”;
-----解决方法:
报这个错误的原因是,在自己的界面中,以及存在了布局了,不能再布局了。、
举例:我的代码是
QGridLayout *myLayout = new QGridLayout (this);
运行后,报了如下错误:
QLayout:Attemping to add QLayout " " to MainWindow "MainWindow",which already has a layout
直接把this去掉,就能解决这个错误了,订正代码如下:
QGridLayout *myLayout = new QGridLayout ();
10:报错信息:‘Nothing to be done for ‘first‘’
------解决方法:
这个意思就是qt编译器提示说,现在的代码,前面已经全部运行了一遍,不需要再运行啦。想要运行的话,需要稍微修改修改。哪怕在代码里面加一个空格。
11:报错信息:'assignment of read-only variable 'falg'' In lambda function:
------解决方法:
这个报错信息,是因为在[=]()结构的lambda表达式里,在表达式里面对变量进行赋值的时候,设置的变量值是不能改变的,想要改变变量值,需要加入mutable关键字。举个例子:
开始我的代码是:
int a = 10; connect(btn,&QPushButton::clicked,[=](){ a = 20; count<<a; });
这个时候就会报错:'assignment of read-only variable 'a'',lambda默认只读数据,加入mutable后,代码如下:
int a = 10; connect(btn,&QPushButton::clicked,[=]()mutable{ a = 20; count<<a; });
这个时候,a的值就是20了。
注意:这个20,只能在这个connect函数范围内有效,脱离了connect这个范围后,a的值又是10,没有修改成20哦。如下:
int a = 10; connect(btn,&QPushButton::clicked,[=]()mutable{ a = 20; count<<a; }); cout<<a;
第一a是20,第二个a是10;
题外话:我想找那种lambda表达式里面修改变量值后,不仅仅是局部有效,脱离connect后,在connect函数外也是被修改的值,但是我没有找到,要是有别的学习qt的人知道,麻烦请告知,互相交流学习哦
12 switch循环中报错:‘break’ statement not in loop or switch statement
-----解决方法:
我也是被自己给傻到了,做到这里的时候,报错,我都难于理解。怎么找都找不到错误。最后一行一行看下去的时候。才发现忘记加{ }了。以下错误示范:
错误:switch(flag) case 1: printf("q"); break; case 1: printf("w"); break; case 1: printf("e"); break; case 1: printf("r"); break; default: break;
正确的:
switch(flag){ case 1: printf("q"); break; case 1: printf("w"); break; case 1: printf("e"); break; case 1: printf("r"); break; default: break; }
13 添加图片资源时,运行的时候报错:“error: No rule to make target '../dream/res/??.png', needed by 'debug”
------解决方法:
原因:Qt找不到该文件了,所以就会出现编译错误的结果。最佳的方式是重新添加,删除原来的文件。
方法:第一步:如下图,打开你的Qt项目,找到.pro文件,双击打开,拉到最下面找见Resourse+=\的文字,删除边框里面的内容。之后保存crtrl+s。
第二步:删除本地项目文件夹中的.qrc 文件和.user文件以及debug文件夹下所产生的的所有的内容,如下图红框里面的内容都删除。
第三步:删除之后Qt会提示你是否保存还是关闭的按钮,选择关闭。
第四部:上面所有完成之后,关闭项目,再重新打开,重新添加图片就可以正常运行了。
11:设置窗口状态的函数: setWindowState()
- 最大化 Qt::WindowMaximized
- 最小化Qt::WindowMinimized
- 全屏显示Qt::WindowFullScreen
- 活动窗口Qt::WindowActive等
- 默认值为正常状态 Qt::WindowNoState
12:窗口的几何布局需要分有框架和没有框架的两种类型
有框架的函数:
- x()
- y()
- frameGeometry()
- pos()和 move()等函数
没有框架的函数:
- geometry()
- width()
- height()
- rect()和 size()等函数
13:Qt学习过程中,碰到的一些函数,关于它们的作用?
- pos()函数:返回窗口的位置,是一个坐标值。
- rect()函数:返回不包含边框的窗口内部矩形,窗口内部左上角是(0,0)点。
- size()函数:返回不包含边框的窗口大小信息
- width()函数:返回窗口内部的宽
- height()函数:返回窗口内部的高
14:助记符来定位键盘焦点到对应的部件上的规则?
助记符就是我们所说的加速键。使用英文标签时,在字符串的一个字母前面添加“&.”符号,就可以指定这个标签的加速键是 Alt 加上这个字母;对于中文,需要在小括号中指定加速键字母
比如:
英文:"&Button:"
中文:"数字选择框(&N):"
15:定位过滤器的使用方法?
“前缀符号十空格十+要定位的内容”
16:网格布局函数gridLayout函数和设置间距的方法:
网格布局函数gridLayout函数:
QGridLayout::addWidget ( QWidget * widget, int row, int column, Qt::Alignment alignment = 0 )
row:行位置
column:列位置alignment;对齐方式
void QGridLayout::addWidget(QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0)
This is an overloaded function.6个参数表示控件名,行,列,占用行数,占用列数,对齐方式
注意:一般后面的对齐方式默认不写。
设置间距的方法:
gridLayout.setSpacing(value); //value取整数值,即为int数值。
17:在设计界面时,用网格布局的时候,会碰见自己设计的按钮/标签的大小不符合自己的心意,那么应该怎么处理呢?
比如:在网格布局中,我们设置了一个标签,命名为label1,先需要写下一个代码,如下:
label1->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
这行代码的主要作用是将组件的大小可以进行扩展。
然后可以用以下函数进行设置一个固定的大小:
label1->setFixedSize(100,50);
18:两个界面怎么进行切换?
首先文件->新建文件夹->Application->Qt Widgets Application。命名啥的看自己,也可以跟着我命名,熟悉一下后面的界面切换流程。我这里命名的是MainWindow,基类就是mainwindow类型。
注意,我给代码上了注解,可以自己看注解,实现过程中,遇到难题的,可以留言,看到就回,随缘
1:首先的主界面的头文件代码为:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H
2:对应的,主界面的源代码为:
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QPushButton> #include "submainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //设置一个大小和窗口标题的窗口 this->resize(800,600); this->setWindowTitle("登录"); //创建一个子窗口 SubMainWindow *s = new SubMainWindow(); //创建一个按钮 QPushButton *btn = new QPushButton("下一页",this); //监测按钮信号,随时跳转到新窗口 connect(btn,&QPushButton::clicked,[=](){ this->hide(); s->show(); }); //监测窗口s的回退信号 connect(s,&SubMainWindow::back,[=](){ s->hide(); this->show(); }); } MainWindow::~MainWindow() { delete ui; }
3:子界面的头文件代码(子文件的创建是:新建-》Qt-》Qt 设计师界面类 基类照样可以选择mainwindow类)
#ifndef SUBMAINWINDOW_H #define SUBMAINWINDOW_H #include <QMainWindow> namespace Ui { class SubMainWindow; } class SubMainWindow : public QMainWindow { Q_OBJECT public: explicit SubMainWindow(QWidget *parent = 0); ~SubMainWindow(); signals: //创建一个信号 void back(); private: Ui::SubMainWindow *ui; }; #endif // SUBMAINWINDOW_H
4:子界面的源代码:
#include "submainwindow.h" #include "ui_submainwindow.h" #include <QPushButton> SubMainWindow::SubMainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::SubMainWindow) { ui->setupUi(this); //建立一个有大小和有标题的子窗口 this->resize(800,600); this->setWindowTitle("查询"); //建立一个按钮 QPushButton *btn = new QPushButton("back",this); //监测信号,当按下back信号的时候,会发出一个back信号 connect(btn,&QPushButton::clicked,[=](){ emit this->back(); }); } SubMainWindow::~SubMainWindow() { delete ui; }
提示:多看多写,理清里面的逻辑关系
19:在Qt中,用QLineEdit文本里面设置了一个数字,然后在两边设置了“+”和“-”按钮,怎么用这两个按钮控制文本里面的数字,对数字进行加减呢?
首先要建立信号和槽的链接,在头文件里面,设置两个槽,如下:
private slots: void reduce(); void add();
然后针对这两个按钮,进行信号连接,假设两个按钮分别为(b1)和(b2),所以代码有:
connect(b1,SIGNAL(clicked()),this,SLOT(reduce())); connect(b2,SIGNAL(clicked()),this,SLOT(add()));
接下来,在这两个槽函数中,分别对文本进行数据读取和增加减少操作,文本名假设为(lineEdit):
void MainWindow::reduce() { int v = lineEdit->text().toInt(); v -= 1; lineEdit->setText(QString::number(v)); } void MainWindow::add() { int v = lineEdit->text().toInt(); v += 1; lineEdit->setText(QString::number(v)); }
20: 给了一个按钮,一个LineEdit文件框,怎么点击一下按钮,文本框内的数字自动增加呢?
不同于上面的点一次,加一次数字,这个是点一次,数字会一直增加。
这里需要用到定时器,如下:
connect(button,&QPushButton::clicked,[=](){ //按下按钮,传送信号 QTimer *timer = new QTimer(); timer -> setInterval(500); //定时器每500ms,开始定时,即每隔一段时间进行响应处理 timer->start; connect(timer,&QTimer::timeout,[=](){ //每500ms,传送一次信号 num++; lineEdit->setText(QString::number(num)); //将数值显示在lineEdit上面 if(num >= 64) { timer->stop(); //停止定时 } }); });
这里是主要的核心代码,像那些小细节方面的事情,比如按钮的创立,头文件的num的定义,就没有说了。默认是大家都明白的。
21:在想用lambda表达式的connect情况下,怎么做到多界面的参数传递呢?
这个本人在做小项目的时候,遇到的新手难题,在网上搜了很多,传递参数的三种办法啥的,还跟着几个博客敲了一遍,发现我还是用不了,明明函数里面定义好的变量,在编辑的函数中用的时候,就是提醒未定义变量,不在范围之类的错误。
后来花了一些功夫,在不影响自己原来的connect信号设定的前提下,用全局变量来进行参数的传递,能够完美的解决这个问题。(提示:我的是没有用ui进行设计的,都是纯代码)
----------------------------------------------------在子界面中------------------------------------------------------
不用在.h的头文件中添加任何函数或者声明啥的,直接在子界面中的类函数外面添加代码:
QString str;
然后在子界面中的connect函数对str进行定义,比如我的按钮是btn,点击一下按钮,会对str进行赋值,代码如下:
connect(btn,&QPushButton::clicked,[=](){ str = line->text(); //line是我给QLineEdit创建的一个变量名 emit this->back(); //这个不用理会,是我项目中,返回主界面的一个信号 }
-------------------------------------------------------主界面---------------------------------------------------------
在主界面的.h头文件中,同样不需要设置任何啥的,在类外面写代码:
extern QString str;
用了extern 关键字,然后因为子界面已经定义过了,主界面也写了引用的代码,直接在主界面的主程序里面写入你想传递给别的函数名,有一点拗口,看我代码:
line2 -> setText(str);
我自己设置的一个QLineEdit的变量名,是在主界面中的,把子界面的参数直接传递给了主界面的line2函数里面了。
22:怎么用纯代码的形式设计一个能够嵌入方框左上角的方法?
运行结果如图:
有两种方式可以完成:
第一种:
先建立一个label,然后设置该标签下的QFrame中的frameShape格式为Box,设置frameShadow为Sunken,然后删除label文字,这样就得到了一个空方框。然后,再调出另一个label控件,然后选择autoFillBackground为true,并将此标签的位置调试到左上角,即完成嵌入的效果。
第二种:
比第一种简单,用QGroupBox 控件,代码如下:
头文件.h
#include <QGroupBox> #include <QPushButton> #include <QVBoxLayout> private: QGroupBox *box; QPushButton *button; QVBoxLayout *vbox;
源文件.cpp
//实例 QGroupBox box = new QGroupBox(this); //位置、大小 box->setGeometry(QRect(30,30,340,100)); //标题 box->setTitle("语音栏目");
23:设置了一个按钮后,并对按钮进行了命名,怎么把按钮上面文字的位置进行设置呢?
这个不难,一句代码就能解决,假设按钮变量名为btn,则设置文字位置代码为:
btn->setStyleSheet("text-align:left") //靠左 btn->setStyleSheet("text-align:right") //靠右
24: 自己设计了一个界面,有多个按钮,怎么在页面点击按钮后,原来设计的清空,变成自己点击按钮后的新页面呢《=》等同于怎么清空页面呢。
这个不难,本文主要以网格布局的QGridLayout来说明,只要写入以下代码,就能完成页面的清空。
QGridLayout *myLayout = new QGridLayout(); if(myLayout) { QLayoutItem *child; while(child = myLayout->takeAt(0)) != 0) { if(child->widget()) { child->widget()->setParent(NULL); } delete child; } }
25:在用水平和垂直布局的时候,遇到里面设置的控件位置得不到自己想要,用了Qt:Align...都解决不了,现在有一种方式,能很好的解决问题。方式如下:
使用伸缩--addStretch 函数来解决位置问题。
-------------------------------------------------------------------------------------------------------------------------
居右:
QHBoxLayout *pHLayout = new QHBoxLayout(); pHLayout->addStretch(); // 添加伸缩 pHLayout->addWidget(pButton1); pHLayout->addWidget(pButton2); pHLayout->addWidget(pButton3); pHLayout->addWidget(pButton4); pHLayout->addWidget(pButton5);
效果图:
-------------------------------------------------------------------------------------------------------------------------居中:
QHBoxLayout *pHLayout = new QHBoxLayout(); pHLayout->addStretch(); // 第一个控件之前添加伸缩 pHLayout->addWidget(pButton1); pHLayout->addWidget(pButton2); pHLayout->addWidget(pButton3); pHLayout->addWidget(pButton4); pHLayout->addWidget(pButton5); pHLayout->addStretch(); // 最后一个控件之后添加伸缩 pHLayout->setSpacing(10);
效果图:
-------------------------------------------------------------------------------------------------------------------------
均分:
QHBoxLayout *pHLayout = new QHBoxLayout(); pHLayout->addStretch(); pHLayout->addWidget(pButton1); pHLayout->addStretch(); pHLayout->addWidget(pButton2); pHLayout->addStretch(); pHLayout->addWidget(pButton3); pHLayout->addStretch(); pHLayout->addWidget(pButton4); pHLayout->addStretch(); pHLayout->addWidget(pButton5); pHLayout->addStretch(); pHLayout->setSpacing(0);
效果图:
26:设置字体大小函数setPointSize()和像素大小 函数setPixelSize()的区别
setPixelSize()函数使用像素作为单位来设置字体大小
setPointSize()函数规定了实际中我们肉眼看到的字体的大小,与像素无关
使用setPixelSize函数设置大小,在像素大小不同的设备上显示的大小也不同
使用setPointSize函数设置大小,在不同设备上显示的大小是相同的
27: QFont常用的函数属性:
QFont常用属性 | 描述 |
setFamily | 设置字体 |
setPixelSize | 设置字体像素大小 |
setBold | 字体加粗 |
setItalic | 斜体 |
setPointSize | 设置字体大小 |
setOverline | 上划线 |
setUnderline | 下划线 |
setStrikeOut | 删除线 |
28 qt中msleep、sleep、usleep函数的简单介绍
三个都是静态函数,引入头文件后可以直接调用,且精确度高,可以精确到微秒。
sleep的单位是秒。
msleep的单位是毫秒
usleep的单位是微秒
他们的作用作用是强制当前线程休眠
29 Qt中的显示函数show()和exec()函数的简单介绍:
show()函数:
显示一个非模式对话框。控制权即刻返回给调用函数。弹出窗口是否模式对话框,取决于modal属性的值。
exec()函数:
显示一个模式对话框,并且锁住程序直到用户关闭该对话框为止。函数返回一个DialogCode结果。在对话框弹出期间,用户不可以切换同程序下的其它窗口,直到该对话框被关闭。
30 非模式对话框和模式对话框的个人理解:
模式对话框:就是在弹出窗口的时候,整个程序就被锁定了,处于等待状态,直到对话框被关闭。这时往往是需要对话框的返回值进行下面的操作。如:确认窗口(选择“是"或“否”)。
非模式对话框:在调用弹出窗口之后,调用即刻返回,继续下面的操作。这里只是一个调用指令的发出,不等待也不做任何处理。如:查找框。
31 QPalette对应的函数作用的例子展示:
32 QString的arg方法
在QT的QString中,arg方法类似于C中的printf中使用的格式输出符(只是有点类似)。
在QT5的帮助文档中,可以看出以下几点:
使用arg(str1, str2, str3)这种方法进行替换。
使用arg(str1).arg(str2).arg(str3)这种方法进行替换。
使用arg(int, int, int)这种方式进行替换。
解释以下两种方法:
一:使用arg(str1, str2, str3)
这种方法要求str1、str2、str3都为const QString &类型,即:
QString QString::arg(const QString & a1, const QString & a2, const QString & a3) const
同时,arg( )里的参数实现从1个到9个,也就是说最多只能有9个!即在实现中,arg的定义中参数最多的为:
QString QString::arg(const QString & a1, const QString & a2, const QString & a3, const QString & a4, const QString & a5, const QString & a6, const QString & a7, const QString & a8, const QString & a9) const
这也就意味着,如果有如下代码:
QString str = QString("%1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11"). arg("1","2","3","4","5","6","7","8","9")
str将只会输出:
"1 2 3 4 5 6 7 8 9 %10 %11"
解决方法为在后面再加一个arg方法,放上后面两个对应的参数:
QString str = QString("%1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11"). arg("1","2","3","4","w","6","7","8","9").arg("a","b"); //输出为: // "1 2 3 4 5 6 7 8 9 a b"
注意:在QT5帮助文档中,给出了如下代码
QString str; str = "%1 %2"; str.arg("%1f", "Hello"); // returns "%1f Hello" str.arg("%1f").arg("Hello"); // returns "Hellof %2"
二.使用arg(str1).arg(str2).arg(str3)
这种方法其实前面用到了,如下面例子:
QString str=QString("%1 %2 %3 %4").arg("A").arg("B").arg("C").arg("D"); //str=="A B C D"
简单说就是挨着替换呗。但请注意下面的形式:
str = QString("%1 %2").arg("%1World", "Hello"); qDebug()<<str; //输出为:"%1World Hello" str = QString("%1 %2").arg("%1World").arg("Hello"); qDebug()<<str; //输出为:"HelloWorld %2" //第一个arg执行完后变为:QString("%1World %2").arg("Hello") //再次执行后"Hello"替换的为%1
所以在使用多个arg( )连接时,一定要注意,前面连接使用的arg( )里如果有“%+数字”的情况,后面的arg( )会同样替换!
请注意下列例子:
str = QString("%1 %2").arg("%1World").arg("Hello"); //输出:"HelloWorld %2" str = QString("%1 %2").arg("%2World").arg("Hello"); //输出:"HelloWorld Hello" str = QString("%1 %2").arg("%3World").arg("Hello"); //输出:"%3World Hello" str = QString("%1 %2").arg("%8World").arg("Hello"); //输出:"%8World Hello" str = QString("%1 %6").arg("%3World").arg("Hello"); //输出:"HelloWorld %6" str = QString("%2 %6").arg("%3World").arg("Hello"); //输出:"HelloWorld %6" str = QString("%0 %6").arg("%3World").arg("Hello"); //输出:"HelloWorld %6" str = QString("%-1 %6").arg("%3World").arg("Hello"); //输出:"%-1 HelloWorld"
arg( )里的参数在进行替换时,只会按照数字从小到大的顺序进行替换,只有比当前数字小的所有数字都替换完成了,才会替换当前数字,否则将当前数字和%按字符串处理。且数字为自然数!
三. 使用arg(int, int, int)
原型【1】为:
QString QString::arg(int a, int fieldWidth = 0, int base = 10, QChar fillChar = QLatin1Char( ' ' )) const
a:表示要处理的数字;fieldWidth:字宽;base:数字基数
如下列:
str = QString("十进制 63 的十进制为 %1") .arg(63, 0, 10); //输出:"十进制 63 的十进制为 63" str = QString("十进制 63 的十六进制为 %1") .arg(63, 0, 16); //输出:"十进制 63 的十六进制为 3f" str = QString("%1 %L2 %L3") .arg(12345) .arg(1987654321) //根据结果,可知道这个L的作用 .arg(12345, 0, 8); //但使用这种方式时,L失效 //输出为:12345 1,987,654,321 30071 //这里%L3的L没有任何作用
在原型【1】中的a的类型还可以是uint、long、double、udouble等数字的类型!
这里当a的类型为double时,原型为:
QString QString::arg(double a, int fieldWidth = 0, char format = 'g', int precision = -1, QChar fillChar = QLatin1Char( ' ' )) const
多了两个参数:format和precision,一个指明规格,一个指明精度。规格默认为 'g' 或 'G',指示后面的精度为整数和小数部分总和的长度;规格为'e'或 'E' 时,表示为科学记数法形式,精度部分指示的为小数部分的位数长度;规格为其他字符时,无作用,输出原double数字。如:
double d = 12.345689; str = QString("delta: %1").arg(d, 0, 'g',4); //输出为:"delta: 12.35" ---这里进行了四舍五入 str = QString("delta: %1").arg(d, 0, 'G',5); //输出为:"delta: 12.346" ---这里进行了四舍五入 str = QString("delta: %1").arg(d, 0, 'e',4); //输出为:"delta: 1.234e+01" str = QString("delta: %1").arg(d, 0, 'E',4); //输出为:"delta: 1.234E+01" str = QString("delta: %1").arg(d, 0, 'r',4); //输出为:"delta: 12.345689" str = QString("delta: %1").arg(d, 0, 'Q',4); //输出为:"delta: 12.345689"
33 QFileInfo类的使用
QFileInfo的几个构造函数:
QFileInfo ( const QString & file )
QFileInfo ( const QFile & file )
QFileInfo ( const QDir & dir, const QString & file )
QFileInfo ( const QFileInfo & fileinfo )
一般用法:
QFileInfo fileInfo(path);
//或者
QFileInfo fileInfo;
fileInfo.setFile(path);
bool exists(); 判断文件是否存在,若存在返回true。
qint64 size(); 获取文件大小,返回bytes。
路径和文件名相关:
QString path(); 返回文件路径,不包含文件名。
QString filePath(); 返回文件路径,包含文件名。
QString fileName(); 返回文件名称。
-----------------------------------------------------例子如下--------------------------------------------------------
QFileInfo fileInfo("/home/dipper/xyz.tar.gz");
fileInfo.path(); // returns "/home/dipper"
fileInfo.fileName(); // returns "xyz.tar.gz"
fileInfo.baseName(); // returns "xyz"
fileInfo.completeBaseName(); // returns "xyz.tar"
fileInfo.suffix(); // returns "gz"
fileInfo.completeSuffix(); // returns "tar.gz"
类型:
bool isFile(); 判断是否是文件。
bool isDir(); 判断是否是路径。
bool isSymLink(); 判断是否是符号链接。
QString symLinkTarget(): 返回符号链接的文件
日期相关:
QDateTime created(); 创建时间
QDateTime lastModified(); 最近修改时间
QDateTime lastRead(); 最近读时间
权限:
isReadable()
isWritable()
isExecutable()
所有者:
ower(), owerId(), group(), groupId(), permissions(),
permission(QFile::Permissions permissions)
dir(): 返回父目录
//下面三个都返回"~/examples/191697"
QFileInfo fileInfo1("~/examples/191697/.");
QFileInfo fileInfo2("~/examples/191697/..");
QFileInfo fileInfo3("~/examples/191697/main.cpp");
下面三个都返回"."
QFileInfo fileInfo4(".");
QFileInfo fileInfo5("..");
QFileInfo fileInfo6("main.cpp");
相对路径和绝对路径
QString absolute = "/local/bin";
QString relative = "local/bin";
QFileInfo absFile(absolute);
QFileInfo relFile(relative);
34: Qt中的“ :”和“ ::”的介绍:
“ :” :单个冒号。 一般指继承. Class 派生类 : 基类
“ ::”:双冒号。是作用域 作用域运算符 Qt::xxx。qt::xxx表示作用域qt中的名称xxx,qt可以是名字空间、类、结构;