大家好,欢迎来到IT知识分享网。
关于Qt
什么是Qt?
Qt是一个跨平台的C++图形用户界面应用程序框架。
Qt官网:https://www.qt.io/
Qt的下载与安装
所有Qt版本下载地址 http://download.qt.io/archive/qt/
所有版本的Qt Creator下载地址https://download.qt.io/archive/qt/
注意:安装时只需安装Qt,会自动安装Qt Creator。如果单独安装会导致kit包无法识别。
Qt整体目录结构
学习Qt的比较好的论坛和博客
| 网址 | 说明 |
|---|---|
| https://gitee.com/feiyangqingyun | 有多年Qt开发经验,而且还在持续性更新仓库 |
| http://www.qtcn.org/bbs/i.php | Qt中文开发论坛 |
| https://www.qt.io/ | Qt官网 |
添加Qt环境变量
配置了环境变量后,在以后的项目中可以直接运行exe文件打开程序,否则需要给exe文件添加运行条件。
进入环境变量,在系统环境变量中的path,添加Qt编译器的路径:D:\Tools\Qt\Qt5.14.2\5.14.2\mingw73_64\bin
Qt Creator
编译器
- 在Windows下的Qt默认使用minGW作为编译器。
- MinGW即Minimalist GNU For Windows,是将GNU开发工具移植到Win32平台下的产物,是一套Windows上的GNU工具集,用其开发的程序不需要额外的第三方DLL支持就可以直接在Windows下运行。
- 在Windows系统中,还可以使用MSVC版本的Qt,需要使用Visual C++作为编译器。
项目目录文件说明
| 文件 | 说明 |
|---|---|
| *.pro | 该文件是项目文件,其中包含了项目的相关信息 |
| *.pro.user | 该文件中包含了与用于有关的项目信息 |
| *.h | 类的头文件 |
| *.cpp | 类的源文件 |
| *.ui | 界面文件 |
| main.cpp | 该文件中包含了main()主函数 |
静态编译和动态编译
- 动态编译:编译的程序需要发布,就需要包含dll文件,这种编译方式被称为动态编译。当程序运行时需要有对应dll支持才能正常运行。
- 静态编译:是相对于动态编译而言的。将Qt的库进行重新编译,用静态编译的Qt库来链接程序,这样生成的目标文件就可以直接运行,而不需要dll文件的支持。不过这样生成的exe文件也很大,而且静态编译缺乏灵活性,不能插件部署。
设置应用程序图标
- 查找并创建ico文件,可以先在网上查找好图标文件,可以是png或者其他格式的图片,通过转ICON工具转换。将转换后的文件放在工程文件下。
- 修改.pro文件,在最后一行添加代码
RC_ICONS = logo.ico
- 重新运行程序,可以看到窗口的图标已经发生变化。
创建工程
创建工程时,出现这个界面,这个是选择编译套件,我们MinGW实际上就是一个GCC,如果装了Android就会出现一个Android的编译套件。
QMainWindow、QWidget和QDialog的区别
出现这个界面,base class中,
- QMainWindow主要是在PC端运行的,带菜单栏的窗口。
- QDialog是对话框窗口,
- Qwidget是Qt中最常用的基类,所有按键、下拉框都继承QWidget。
QMainWindow是设计在PC端运行的软件可以有菜单栏等,QWidget是设计在移动端运行的软件。
执行编译并运行的快捷键是CTRL+R
Qt中include头文件,头文件是没有.h的,头文件和类名是一样的。
创建新的带UI界面的class
- 工程名右击,选择Add New。选择Qt-Qt设计师界面类。
Qt Creator中debug、profile、release的区别
一般qt可以生成debug、profile、release三个版本。
- debug是前期版本,是以-g模式编译,带符号信息便于我们调试。
- release是后期版本,做过优化,性能更上一个档次。
- profile则是两者之间取平衡,兼顾性能和调试,可以看做是性能更优但是兼顾调试的版本。
生成可执行的exe
Qt Creator编译生成的exe是不能直接运行的,因为缺少了一些必要的组件。
切换到性能优化最好的release,再编译一次,在工程编译文件夹下的release文件夹下生成exe。复制这个exe到新目录,用这个目录生成可执行的环境文档。因为编译生成的很多文件包含有源码。
打开Qt (MinGW 7.3.0 64-bit)
就可以生成可执行的exe
生成的exe在控制台输出debug信息
需要在.pro文件下添加
QT += widgets CONFIG += console c++11
另外在release版本不能输出控制台
Ps:针对qt+mingw及Qt+vs,都有效。只是qt+vs环境下,Ctrl+R运行,就会输出cmd窗口和应用程序窗口;在qt+mingw环境下,Ctrl+R运行,只输出应用程序窗口,在非开发环境单独运行应用程序时,才会同时输出cmd窗口和应用程序窗口;
qmake和cmake
- qmake是为Qt量身打造的,使用起来非常方便。qmake是Qt提供的一个编译工具,可以生成与平台无关的.pro文件,然后利用该文件生成与平台相关的MakeFile文件。MakeFile文件中包含了要创建的目标文件或可执行文件、创建目标文件所依赖的文件和创建每个目标文件时需要运行的命令等信息。
- cmake使用上不如qmake简单直接,但是复杂换来的是强大的功能
添加/删除组件
在Qt的安装目录下有个MaintenanceTool可以添加、删除组件。
在选择添加或删除的步骤时,出现“此操作至少需要一个有效……”的问题。需要点“设置”,手动添加配置。
手动添加储存库要定位一个储存有qt在线安装镜像的地址。http://download.qt.io/static/mirrorlist/显示了各国qt镜像站点,中国有4个,点击HTTP进入一个网络文件夹。依次进入online/qtsdkrepository/windows_x86/root/qt/,复制当前地址框地址,在储存库中选择临时储存库,加入地址。可以测试一下网络连通情况。如果网络测试正常就好了。
*.ui文件
在Visual Studio 下开发
Visual Studio 2017
使用Visual Studio编译Qt,需在安装qt时,选择MSVS2017编译套件。安装VS时,需要安装C++桌面套件。
- 安装VS时选择“使用C++的桌面开发”,其他可以不选。
- 安装完成以后,选择“工具”-扩展和更新-联机 在搜索框中输入“qt”,安装“Qt Visual Studio Tool”即可。如果无法联网安装,则可以去清华大学镜像中下载离线的vsix包,下载好后双击即可安装,注意插件安装过程需要关闭vs,才能安装。
- 重启VS即可看到目录栏中新增Qt VS Tools,下拉选择Qt Option – Qt Version – Add – 安装 Qt的路径(直到msvs2017_64)。
- 重启VS即可在新建项目中新建Qt项目。
Visual Studio 2019
- 在2019版本下,是在”扩展-管理扩展”下,搜索Qt,安装Qt Visual Studio Tool。
- 如果安装过程出现异常,或者联机失败,则可以自己去下载这个扩展。清华大学的镜像提供非常完成的各个开源库镜像,可以有效解决国内访问速度慢的问题。https://mirrors.tuna.tsinghua.edu.cn/,找到Qt-archive-vsaddin,里面有各个版本的vs插件。选择最新的,根据vs的版本号下载对应的插件即可。
- QtCreator创建的工程和VS中创建的工程,两者都是可以互相转换的。在插件的Open Qt Project……可以直接打开Qt Creator创建的工程,但是有时提示“未将对象引用设置到对象的实例”,则创建失败后,重新从项目文件夹下打开vcxproj尾缀的文件即可。
中文乱码问题
#ifdef WIN32 //此处使用条件编译,是为跨平台做准备 #pragma execution_character_set("utf-8") #endif
“常量中有换行符”的问题
Qt Creator的工程用VS打开,编译出现“常量中有换行符”的问题。
- 在项目-属性-常规-字符集,将字符集设置为多字符集。
- 在同一目录下的c/c+±命令行-其他选项的末尾添加/utf-8
添加功能块
在Qt Creator中是在.pro文件添加功能块,但是在VS中并没有pro文件。需要在项目右击,选择属性,在Qt Project Settings中的Qt Modules中添加相应的功能块。
使用VS Code编辑
需要在文件路径下,添加“.vscode”文件夹。
在.vscode文件夹下,添加“c_cpp_properties.json”文件
{
"version": 4, "configurations": [ {
"name": "gcc_64", "intelliSenseMode": "gcc-x64", "includePath": [ "D:/Qt/Qt5.14.2/5.14.2/mingw73_64/include/", "${workspaceRoot}" ], "browse": {
"path": [ "D:/Qt/Qt5.14.2/5.14.2/mingw73_64/include/", "${workspaceRoot}" ] }, "compilerPath": "", "cStandard": "c11", "cppStandard": "c++17" } ] }
在.vscode文件夹下,添加“settings.json”文件
{
"files.associations": {
"qpushbutton": "cpp", "qgridlayout": "cpp" } }
宏定义
Q_OBJECT
Q_OBJECT宏扩展了普通C++类的功能,比如信号和槽的功能,必须在类的最开始处定义这个宏。
项目文件pro
项目用户文件pro.user
功能
日期时间选择编辑框
Qt提供QDateTimeEdit类来提供日期和时间选择。
构造
/* 默认情况下,不指定时间日期,会按照当前系统的格式,构造出“2000年1月1日 0时0分0秒”格式的日期 */ QDateTimeEdit *dateTimeEdit = new QDateTimeEdit(this); QDateTimeEdit *dateTimeEdit2 = new QDateTimeEdit(QDateTime::currentDateTime(), this); QDateTimeEdit *dateEdit = new QDateTimeEdit(QDate::currentDate(), this); QDateTimeEdit *timeEdit = new QDateTimeEdit(QTime::currentTime(), this);
设置日期时间
可以通过setDateTime()、setDate()、setTime()这三个函数来设置QDateTime的当前日期时间。
设置日期时间格式
dateTimeEdit->setDisplayFormat("yyyy-MM-dd HH:mm:ss"); dateTimeEdit2->setDisplayFormat("yyyy/MM/dd HH-mm-ss"); dateEdit->setDisplayFormat("yyyy.M.d"); timeEdit->setDisplayFormat("H:mm");
具体日期时间格式见QDateTime。
设置可选的日期时间范围
QDateTimeEdit *dateEdit = new QDateTimeEdit(QDate::currentDate(), this); dateEdit->setMinimumDate(QDate::currentDate().addDays(-365)); // -365天 dateEdit->setMaximumDate(QDate::currentDate().addDays(365)); // +365天
实现同样功能的函数还有:setDateTimeRange()、setDateRange()、setTimeRange()、setMaximumDateTime()和setMinimumDateTime()、setMinimumTime()和setMaximumTime()。
设置可以通过日历选择
dateEdit->setCalendarPopup(true); // 日历弹出
设置通过日历选择后,原来上/下箭头,变成只有下箭头。点击下箭头,会弹出日历控件,如果设置了日期时间范围,那日历的范围也同步更新。
获取设置的日期时间
QDate date = dateEdit->date(); // 日期 QDateTime dateTime = dateEdit->dateTime(); // 日期时间 QDate maxDate = dateEdit->maximumDate(); // 最大日期 QDateTime maxDateTime = dateEdit->maximumDateTime(); // 最大日期时间 QTime maxTime = dateEdit->maximumTime(); // 最大时间 QDate minDate = dateEdit->minimumDate(); // 最小日期 QDateTime minDateTime = dateEdit->minimumDateTime(); // 最小日期时间 QTime minTime = dateEdit->minimumTime(); // 最小时间
如果需要获取Year、Month、Day等信息,可以通过QDate、QTime进一步获取。
信号
控件提供了3个信号函数:dateChanged()、dateTimeChanged()、timeChanged()。
获取局部信息
如果要获取日期时间编辑框中的局部信息,可以单独选择:
QDateTimeEdit *dateEdit = new QDateTimeEdit(QDateTime::currentDateTime(), this); dateEdit->setDisplayFormat("yyyy/MM/dd HH:mm:ss"); // 设置显示格式 dateEdit->setSelectedSection(QDateTimeEdit::DaySection); // 设置所选部分 /* 通过sectionCount来获取数量,如"yyyy/MM/dd HH:mm:ss"格式下,获取到数量是6 */ int nCount = dateEdit->sectionCount(); // 部分数量 QDateTimeEdit::Section monthSection = dateEdit->sectionAt(1); // 下标为1对应的部分 QDateTimeEdit::Section section = dateEdit->currentSection(); // 当前部分 int nIndex = dateEdit->currentSectionIndex(); // 当前部分下标 // 各部分对应的值 QString strYear = dateEdit->sectionText(QDateTimeEdit::YearSection); QString strMonth = dateEdit->sectionText(QDateTimeEdit::MonthSection); QString strDay = dateEdit->sectionText(QDateTimeEdit::DaySection); QString strHour = dateEdit->sectionText(QDateTimeEdit::HourSection); QString strMinute = dateEdit->sectionText(QDateTimeEdit::MinuteSection); QString strSecond = dateEdit->sectionText(QDateTimeEdit::SecondSection);
常见问题解释
Qt中tr()函数的作用
函数tr()全名是QObject::tr(),被它处理的字符串可以使用工具提取出来翻译成其他语言, 也就是做国际化使用。
只要记住,Qt 的最佳实践:如果你想让你的程序国际化的话,那么所有用户可见的字符串都要使用 QObject::tr()!
但是为什么我们没有写 QObject::tr(),而仅仅是 tr()呢?原来tr()函数是定义在Object里面的,所有使用了Q_OBJECT宏的类都自动具有tr()函数。
在书中看到的一句话,如果想要你做的程序国际化,就把所有用户可见的字符串写到tr()中去,可直接用工具翻译成多语言的版本。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/99841.html



