Qt项目简易开发原理及常见问题解决

一、资源下载地址

https://www.aliyundrive.com/s/jBU2wBS8poH

本项目路径:项目->免费->QtDev

注释:为了方便qt全功能开发,QtDev中包含了qt所有的Win32x64ReleaseDebug库。如果开发简单功能的话可以只下载对应所需要的库即可。

二、项目介绍

1、从零开始开发一个小项目,通过本项目来介绍Qt界面简易开发的过程及原理,简易开发的意思是只需要对应的Qt库及编译工具(如vs2019)即可。电脑不需要安装Qt Creatorvs2019不需要安装Qt插件。本文使用vs2019来描述其原理,根据原理其他平台下如Linux也可以进行简易开发。

2、本项目完成的功能及解决的常见问题如下:

(1)Qt生成的exe添加logo

(2)Qt加载资源来使用icopng图标。

(3)Qt加载资源失败的原因及解决方案,尤其是双击文件使用exe打开时资源加载失败导致图标无法显示。

(4)Qt中文乱码的原因及解决方案。

(5)、软件发布的两种形式:免安装包和安装包。

三、项目开始

1、准备工作

(1)、电脑安装vs2019

(2)Qt库下载

最简单的界面程序开发需要如下文件:

2vs2019新建一个空白解决方案

 

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.exeGuiQtDev.ui转换为ui_GuiGifView.h,然后使用moc.exeGuiQtDev.h转换为moc_GuiQtDev.cpp,然后使用rcc.exeGuiQtDev.qrc转换为GuiQtDev.rcc。右击工程在生成前事件中进行自动转换:

右击工程点击生成,则自动生成这3个文件:

然后将ui_GuiQtDev.hmoc_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编码,所以要将字符串转换一下,否则中文会乱码:

运行程序:

发现PushButtonico不显示了,解决方法:加载rcc文件使用绝对路径,并且要注意编码问题:

先设置GuiQtDev项目为Unicode编码:

然后修改资源加载代码:

重新运行后可以看到资源加载成功:

7、项目发布

免安装包:

就是这个文件夹:

安装包:

使用setup factory来打包Release文件夹,并且可以设置程序是否自动启动及添加桌面快捷方式等。

 

 

 

 

 

 

 

 

posted @ 2021-08-11 18:57  亮琴软件工作室  阅读(569)  评论(0编辑  收藏  举报