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 | TEMPLATE = subdirs |
VS打开QT项目
在C/C++
中添加/utf-8
支持
库编译与引用
库分为动态库和静态库,通过文件名后缀可以知道库的类型:so、dll(动态库)
;a、lib(静态库)
。
在windows平台下使用QT编译,库的后缀为dll和a。
编译库
静态库配置:
在pro文件中加入以下语句即可:
1
2TEMPLATE = lib #生成库
CONFIG += staticlib #类型为静态库动态库配置:
在pro文件中加入以下语句:
1
2TEMPLATE = lib #生成库
DEFINES += BIL_EXPORT提供给外部使用的类需要增加导出前缀:
1
2
3
4
5
6
1
2
3
4
5
6
7class 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
7void 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版本编译,执行文件很大
检查qamke构建配置是否为debug
检查pro文件是否有添加调试宏
1
2QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
win10下编译的执行文件需要管理员才能运行
win10下,文件名里包含setup、install、patch、update,运行时都会请求管理员权限