通过设置Qt项目文件来设置程序/库的生成路径与名字。
设置输出名字
Test
为设置输出名字;- 如果是执行文件则自动为程序添加后缀(.exe),如果是库文件则自动为库添加后缀(.dll)和
libxxx.a
(这里是libTest.a
)名字。1
TARGET = Test
设置输出路径
- 输出为
.pro
项目所在的Test目录下。 $$PWD
意思为当前目录。1
DESTDIR = $$PWD/Test
另外
1 | TEMPLATE = app # 设置为执行文件工程 |
距离上一系列篇已经有半年没有更新了。本次介绍该网络库最近新增的超时功能(超时中断请求)。由于Qt的网络请求不能设置超时时间,故只能额外封装了。
msec <= 0
则禁用超时功能;msec > 0
则使能超时功能,并将超时时间设置为msec
毫秒。1 | /** |
HttpResponseTimeout
构造函数传递QNetworkReply
与timeout
参数用于超时中断设置;QTimer::singleShot
为单次定时器;onTimeout
函数;onTimeout
函数会执行QNetworkReply
的abort
和deleteLater
来完成请求中断。1 | class HttpResponseTimeout : public QObject { |
1 | static HttpService http; |
利用QEventLoop与QNetworkAccessManager实现网络请求不阻塞ui的操作。
exec
与quit
分别为进入和退出事件循环。1 | QNetworkAccessManager manager; |
Vim的光标是经常使用的功能。常见的光标定位有鼠标移动,操控上下左右键盘,除了这些还有更多的光标定位方法。
操作 | 功能 |
---|---|
h |
光标左移 |
j |
光标下移 |
k |
光标上移 |
l |
光标右移 |
shift + 4 |
光标移至行首 |
大写I |
光标移至行首并插入模式 |
0 |
光标移至行尾 |
大写A |
光标移至行尾并插入模式 |
gg 或[[ |
光标移至文件开头 |
大写G 或]] |
光标移至文件结尾 |
数字 + gg |
光标移至指定行 |
ctrl + b |
光标移至上翻页处 |
ctrl + f |
光标移至下翻页处 |
一般我们继承QObject类在头文件中添加,但是有时候需要在源文件中添加。这样就会不可避免地出现编译错误。那么我们该究竟怎么解决它呢?
执行下列源码会报以下错误:
1 | error: undefined reference to `vtable for Object' |
问题源码:
1 | /* main.cpp */ |
函数未定义的错误
。#include 当前文件.moc
就可以了。当前文件.moc
到其类定义下或最后一行(注意:不能Object类先于定义);1 | /* main.cpp */ |
写QML界面会经常使用到很多的属性,其中属性的绑定与解绑尤其重要,决定着该界面属性是否能动态更新的功能。本文介绍属性的绑定与非绑定特性。
:
操作符,作用是左值绑定右值。例:
1 | Item { |
color
绑定父控件myColor
属性。
=
操作符,作用是左值解除右值绑定例:
1 | Item { |
当color = "blue"
被执行时会解除color: myColor
的绑定
Binding
控件对已经解除绑定的属性重新绑定。例:
1 | Item { |
target
为被绑定(左值)的id;
property
为被绑定(左值)的属性,注意类型为字符串;value
为绑定(右值)的属性。使用windeployqt程序生成的库都很大,即使是一个空的程序。对比了一下程序,有些库根本就没有用到却也是打包进来了。本文提供一种剔除多余程序库以达到瘦身的方法。
当一个程序打开运行时候,如果是缺少了库,系统将会弹出对应库找不到的提示对话框。为什么会这样?因为程序运行前先会加载动态库部分到内存以供程序运行调用。
使用反向思维,我们同样地将程序运行起来,然后将程序目录下的库删除,如果能删除的就证明程序没有使用到该库,如果正在被程序使用的库是不能被删除的。利用这一特性可以将一部分库剔除。
当然,这一方法其实并不靠谱,不建议操作。我们需要学习的是反向操作的思维,编程有时候需要那么一点点的反式操作却是能在其中找到乐趣。一方面思维定性是学编程的最大优点,另一方面也是最大的缺点。反向操作在生活中常常能有奇效,比如倒立洗头,看似荒唐(想着这一场景却是有些好笑),但他能完美解决洗头需要闭上眼睛的问题。
CreateToolhelp32Snapshot
,它可以通过获取进程信息为指定的进程、进程堆、模块、线程建立一个快照。编译警告给人的感觉是让人注意这个问题。更有甚者认为,编译警告只不过是给过分小心的人看。事实上为什么会有警告这一个问题本身值得我们去思考?
昨天,新来不久的同事调试一个准备上线的功能,可是怎么也调试不出来。当时刚好在喝水,看到他几百个警告。就和他说你还是处理一下编译警告吧。他一脸焦虑地说:没空弄啊?!功能快要上线了,来帮我看看。他还说,如果是很严重的警告,会导致编译错误,能编译过就可以了。
看着有些无奈,对此非常地不认同。看着他焦虑的表情,先解决问题先。
浏览代码看到有一条警告进入法眼,是这样的use '==' to turn this assignment into an equality comparison.
,意思是使用'=='将该赋值转换为相等比较
。找到相应的代码:1
2
3if (isEmpty = true) {
...
}
同事看了看代码,我知道问题出在哪里了。今晚大吉大利,请你吃鸡腿。既然解决问题了,你也应该解决一下你那些编译警告
,这些警告里面可能隐藏着很多bug。
比如呢?同事一脸好学的样子。看到你程序里面有很多变量未使用
的警告,你应该清理一下它。因为变量可能真的没使用,又可能是你错误使用了其他变量导致。后者带来的后果可能让你的程序刚好能运行,但某些情况下可能出现致命的错误。
正当我转身准备下班的时候,他又问,那我调一下编译警告
提升为编译错误
这样可以吗?
可以是可以,但是要分情况。如果你是新写的程序你可以这样做,如果是已经写了一大部分的项目,如果你这样做可能会造成颠覆性的后果,导致难以控制。因为编译器能轻易地将编译警告变为编译错误,可是你不能轻易地解决它。
那我应该怎么做?
一步一步来吧。新加的警告你就在编写的时候解决它,而旧的警告也要谨慎地解决。对于GCC编译器你可以使用-Werror
参数来让警告不能忽略。让过是MSVC编译器,你可以改变项目的设置。另外一般IDE都有设置怎么将编译警告作为编译错误的操作。
看看谁的速度快?
Qt版本 | 参考 | at | const at | [] | const [] |
---|---|---|---|---|---|
4.8.7 | 14 | 278 | 279 | 639 | 629 |
5.12.3 | 14 | 325 | 322 | 418 | 411 |
Qt4.8.7与Qt5.12.3的相同QList源码
1 | template <typename T> |
测试源码
1 | #include <QList> |
Qml常见诡异失焦情况一般为明明设置了某一控件的焦点, 实际却是不生效。这到底时什么情况呢?用例子来分析这种情况。
1 | Dialog { |
dialog.hide()
调用后dialog重新获得了焦点。1 | Rectangle { |
focus:true
间接地获得焦点了。1 | FocusScope { |