Qt配置与常见问题

1.9k words

Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。

QT配置

设置代码片段

配置路径:工具->选项->文本编辑器->片段

  • 文件头说明

    1
    2
    3
    4
    5
    6
    /**
    * @brief $$
    * @author yaronhuang@foxmail.com
    * @date %{CurrentDate:yyyy/MM/dd}
    * @note
    */
  • 函数注释

    1
    2
    3
    4
    5
    /**
    * @brief $$
    * @param string
    * @return void
    */

多个pro项目管理

1
2
3
4
5
TEMPLATE = subdirs
CONFIG += ordered #顺序编译
SUBDIRS += pro0\
pro1\
app

VS打开QT项目

C/C++中添加/utf-8支持

image-20220429142221837

库编译与引用

库分为动态库和静态库,通过文件名后缀可以知道库的类型:so、dll(动态库);a、lib(静态库)

在windows平台下使用QT编译,库的后缀为dll和a。

编译库

  1. 静态库配置:

    在pro文件中加入以下语句即可:

    1
    2
    TEMPLATE = lib      #生成库
    CONFIG += staticlib #类型为静态库
  2. 动态库配置:

    在pro文件中加入以下语句:

    1
    2
    TEMPLATE = lib      #生成库
    DEFINES += BIL_EXPORT

    提供给外部使用的类需要增加导出前缀:

    1
    2
    3
    4
    5
    6
    #include <QtCore/qglobal.h>
    #ifdef BIL_EXPORT
    # define LUIP_SHARE Q_DECL_EXPORT
    #else
    # define LUIP_SHARE Q_DECL_IMPORT
    #endif
    1
    2
    3
    4
    5
    6
    7
    class LUIP_SHARE SumObj
    {
    public:
    SumObj();

    int run(int a, int b);
    };

    生成的动态库目录下会出现dll和a文件,其中a文件是没用的,它并不能用于静态库,因为它是不完整的,可以看出a文件的体积也很小。

引用库

正常的库名格式为libxxxx.a指定时只需要xxxx即可,如libtest.a,则为 -ltest

同时有动态库和静态库,那么优先链接.so,如果想要强制使用静态库,那么写成-static -lxxxx即可。不过QT编译器好像也会通过类名是否添加导入关键字Q_DECL_IMPORT来确定是链接动态库还是静态库。

在pro文件中加入以下语句:

1
LIBS   += -L$$PWD/../bin/ -ltest #引用bin目录下的test库

常见问题

调用SetObjectName无效

自定义界面时,界面类继承QWidget,然后调用setObjectName()设置样式,但并没有起作用,解决方法如下:

  • 方法1:设置WA_StyledBackground属性this->setAttribute(Qt::WA_StyledBackground);

  • 方法2:将QWidget改成QFrame

  • 方法3:重写paintEvent

    1
    2
    3
    4
    5
    6
    7
    void ClassName::paintEvent(QPaintEvent *)
    {
    QStyleOption opt;
    opt.init(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
    }

编译异常multiple definition of qMain(int, char**)

一般是重复定义main函数了,可以全局搜索main(),或者检查pro文件中是否有重复添加的cpp和h,有时给工程中乱添加文件时会导致这种情况。

release版本编译,执行文件很大

  1. 检查qamke构建配置是否为debug

    image-20220510100621460

  2. 检查pro文件是否有添加调试宏

    1
    2
    QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
    QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO

win10下编译的执行文件需要管理员才能运行

win10下,文件名里包含setup、install、patch、update,运行时都会请求管理员权限

Comments