Qt项目简易开发原理及常见问题解决
一、资源下载地址
https://www.aliyundrive.com/s/jBU2wBS8poH
本项目路径:项目->免费->QtDev
注释:为了方便qt全功能开发,QtDev中包含了qt所有的Win32和x64的Release及Debug库。如果开发简单功能的话可以只下载对应所需要的库即可。
二、项目介绍
1、从零开始开发一个小项目,通过本项目来介绍Qt界面简易开发的过程及原理,简易开发的意思是只需要对应的Qt库及编译工具(如vs2019)即可。电脑不需要安装Qt Creator,vs2019不需要安装Qt插件。本文使用vs2019来描述其原理,根据原理其他平台下如Linux也可以进行简易开发。
2、本项目完成的功能及解决的常见问题如下:
(1)、Qt生成的exe添加logo。
(2)、Qt加载资源来使用ico,png图标。
(3)、Qt加载资源失败的原因及解决方案,尤其是双击文件使用exe打开时资源加载失败导致图标无法显示。
(4)、Qt中文乱码的原因及解决方案。
(5)、软件发布的两种形式:免安装包和安装包。
三、项目开始
1、准备工作
(1)、电脑安装vs2019
(2)、Qt库下载
最简单的界面程序开发需要如下文件:
2、vs2019新建一个空白解决方案
3、创建一个控制台应用项目
4、创建一个基础函数模块,封装编码转换等一些基础功能
源码:
新建工程:
在解决方案下新建一个core文件夹,然后右击core新建空白项目:
然后把源码拖到工程里:
然后设置项目输出目录及项目设置为静态库:
然后设置附加包含目录:
然后设置预处理器:
最后右击生成该项目:
5、创建Qt界面模块
源码:
GuiQtDev.ui:
<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>GuiQtDevClass</class> <widget class="QMainWindow" name="GuiQtDevClass"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>600</width> <height>400</height> </rect> </property> <property name="windowTitle"> <string>Gui</string> </property> <widget class="QWidget" name="centralWidget"/> <widget class="QMenuBar" name="menuBar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>600</width> <height>22</height> </rect> </property> </widget> <widget class="QToolBar" name="mainToolBar"> <attribute name="toolBarArea"> <enum>TopToolBarArea</enum> </attribute> <attribute name="toolBarBreak"> <bool>false</bool> </attribute> </widget> <widget class="QStatusBar" name="statusBar"/> </widget> <layoutdefault spacing="6" margin="11"/> <resources> <include location="GuiQtDev.qrc"/> </resources> <connections/> </ui>
GuiQtDev.qrc:
<RCC> <qresource prefix="/"> </qresource> </RCC>
GuiQtDev.h:
#pragma once #include <QtWidgets/QMainWindow> #include "ui_GuiQtDev.h" class GuiQtDev : public QMainWindow { Q_OBJECT public: GuiQtDev(QWidget *parent = Q_NULLPTR); private: Ui::GuiQtDevClass ui; };
GuiQtDev.cpp:
#include "GuiQtDev.h" GuiQtDev::GuiQtDev(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); }
新建工程:
在解决方案下新建一个modules文件夹,然后右击modules新建空白项目:
然后把源码拖到工程里:
然后设置项目输出目录及项目设置为静态库:
然后设置附加包含目录:
然后设置预处理器:
接下来编辑资源文件:
首先拷贝一个图标文件到源码文件中:
然后在vs中右击qrc文件,选择默认打开方式为QrcEditor.exe:
然后双击qrc文件进行添加图标:
接下来右击ui文件,选择默认打开方式为designer.exe:
双击ui文件进行编辑,比如拖拽一个按钮,并且为按钮显示ico图标(注意后续修改ui文件时要手动重新生成该项目,因为vs无法知道ui文件被修改):
这样界面就设计好了。
接下来描述GuiQtDev模块编译原理。
首先要使用uic.exe将GuiQtDev.ui转换为ui_GuiGifView.h,然后使用moc.exe将GuiQtDev.h转换为moc_GuiQtDev.cpp,然后使用rcc.exe将GuiQtDev.qrc转换为GuiQtDev.rcc。右击工程在生成前事件中进行自动转换:
右击工程点击生成,则自动生成这3个文件:
然后将ui_GuiQtDev.h和moc_GuiQtDev.cpp拖拽到工程中:
然后在GuiQtDev.cpp中增加rcc资源注册的代码:
然后生成该项目:
6、配置Main工程
首先设置Main工程依赖项:
然后删去原有的Main.cpp,重新写一个
main.cpp:
#if defined(WIN32) | defined(_WINDOWS) //不显示控制台 #pragma comment(linker,"/subsystem:windows /entry:mainCRTStartup") #pragma comment(lib, "Shell32.lib") #pragma comment(lib, "ole32.lib") #pragma comment(lib, "User32.lib") #pragma comment(lib, "ws2_32.lib") #pragma comment(lib, "Advapi32.lib") #pragma comment(lib, "Crypt32.lib") #pragma comment(lib, "legacy_stdio_definitions.lib") #pragma comment(lib, "Winmm.lib") #pragma comment(lib, "BaseFunc.lib") #pragma comment(lib, "GuiQtDev.lib") #ifndef _DEBUG #pragma comment(lib, "Qt5Core.lib") #pragma comment(lib, "Qt5Gui.lib") #pragma comment(lib, "Qt5Widgets.lib") #else #pragma comment(lib, "Qt5Cored.lib") #pragma comment(lib, "Qt5Guid.lib") #pragma comment(lib, "Qt5Widgetsd.lib") #endif #endif #include "GuiQtDev.h" int main(int argc, char* argv[]) { QApplication app(argc, argv); GuiQtDev v; v.show(); app.exec(); return 0; }
然后配置工程输出目录和中间目录:
然后配置附加包含目录:
Main预处理器设置:
然后配置附加库目录:
然后右击生成:
最后如果要使程序能够在vs中和在目录里双击exe来正确运行程序的话,还需要配置Main工程的生成后事件,拷贝动态库和资源文件到对应目录:
然后运行exe,可以看到ico图标显示正常:
接下来为exe设置logo:
首先在Main工程目录下放一个logo.ico,然后新建一个logo.rc,文件内容如图,并且在Main.vcxproj里增加三行如图:
然后重新生成exe后就看到有了logo:
接下来我们写当双击某个文件使用我们的exe打开时,如何正确加载资源文件及获取当前选中的文件名:
先设计ui,拖放一个lineEdit控件来显示文件名:
然后加一个接口来提供外部调用:
然后在main函数中获取输入的文件名(第二个参数)来设置到界面中,这里需要注意的是vs默认使用的是gbk编码,而Qt默认使用utf8编码,所以要将字符串转换一下,否则中文会乱码:
运行程序:
发现PushButton的ico不显示了,解决方法:加载rcc文件使用绝对路径,并且要注意编码问题:
先设置GuiQtDev项目为Unicode编码:
然后修改资源加载代码:
重新运行后可以看到资源加载成功:
7、项目发布
免安装包:
就是这个文件夹:
安装包:
使用setup factory来打包Release文件夹,并且可以设置程序是否自动启动及添加桌面快捷方式等。