1. 今天在一个头文件中,发现 #ifdef Q_OS_WIN #ifdef Q_CC_MSVC 之类的都失效了,搞得差点怀疑人生了。经历过之前类似的教训后,排查原来是没有提前引入 qglobal.h 头文件导致的。切记如果要使用Qt的东西,哪怕是最基础的标识宏定义 Q_OS_WIN 之类的,都要保证该前面至少包含了 qglobal.h ,否则都是失败的。很多人和我一样天真的以为编译器会自动处理。
//必须要先引入这个头文件
#include "qglobal.h" #ifdef Q_OS_WIN
...
#else
...
#endif #ifdef Q_CC_MSVC
#pragma execution_character_set("utf-8")
#endif
  1. 有一个场景经常遇到,那就是在符合某个条件下,延时一段时间去执行一段代码,如果短时间内触发多次又不需要频繁执行,只需要执行一次就行。如果选择用QTimer::singleShot无法终止已经触发的,这个时候就要主动实例化一个单次定时器,每次调用前都停止之前的(只要是还没执行都会取消),完美解决。
//QTimer::singleShot(1000, thread, SLOT(xxx()));

static QTimer *timer = NULL;
if (!timer) {
timer = new QTimer;
QObject::connect(timer, SIGNAL(timeout()), thread, SLOT(xxx()));
timer->setSingleShot(true);
timer->setInterval(1000);
}
timer->stop();
timer->start();
  1. 有时候我们发现控件设置透明后背景变成黑色,你可以尝试设置透明度值1而不是完全透明0,这样看起来是透明的但是又保留了窗体的特性。如果想要不应用系统阴影边框可以设置属性 w.setWindowFlags(w.windowFlags() | Qt::NoDropShadowWindowHint);

  2. Qt中的事件过滤器相当于万能大法(终极秘密武器),尤其是对整个应用程序安装事件过滤器,则可以拿到所有的事件。比如可以拿到系统标题栏鼠标按下松开,对所有需要移动的无边框窗体统一拦截进行移动处理。个人建议不到万不得已不建议使用,有一定性能损耗,毕竟这个是从最初源头拦截事件,意味着所有的事件都会到这里过一遍。如果你在收到对应事件后还做了一定耗时的处理,很容易就卡主了UI主线程。

void AppInit::start()
{
qApp->installEventFilter(this);
} bool AppInit::eventFilter(QObject *watched, QEvent *event)
{
if (event->type() == QEvent::NonClientAreaMouseButtonPress) {
qDebug() << "系统标题栏按下";
} else if (event->type() == QEvent::NonClientAreaMouseButtonRelease) {
qDebug() << "系统标题栏松开";
} QWidget *w = (QWidget *)watched;
if (!w->property("canMove").toBool()) {
return QObject::eventFilter(watched, event);
} static QPoint mousePoint;
static bool mousePressed = false; QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
if (mouseEvent->type() == QEvent::MouseButtonPress) {
if (mouseEvent->button() == Qt::LeftButton) {
mousePressed = true;
mousePoint = mouseEvent->globalPos() - w->pos();
}
} else if (mouseEvent->type() == QEvent::MouseButtonRelease) {
mousePressed = false;
} else if (mouseEvent->type() == QEvent::MouseMove) {
if (mousePressed) {
w->move(mouseEvent->globalPos() - mousePoint);
return true;
}
} return QObject::eventFilter(watched, event);
}
  1. linux上可执行文件默认从系统环境变量查找动态库,而windows上默认是从可执行文件所在目录查找,所以有时候为了统一,希望动态库就指定放在可执行文件同一目录下或者相对目录比如lib文件夹,这就需要编译的时候做特殊设置,在pro项目文件中指定rpath(也可以用命令或者第三方工具进行设置),指定好以后默认先从指定的rpath查找动态库是否在,不在然后再去环境变量中的路径查找。
linux {
QMAKE_LFLAGS += "-Wl,-rpath,\'\$$ORIGIN\'"
QMAKE_LFLAGS += "-Wl,-rpath,\'\$$ORIGIN/lib\'"
QMAKE_LFLAGS += "-Wl,-rpath,\'\$$ORIGIN/../lib\'"
}

国内站点:https://gitee.com/feiyangqingyun

国际站点:https://github.com/feiyangqingyun

Qt开发经验小技巧251-255的更多相关文章

  1. Qt开发经验小技巧81-90

    Qt中的QColor对颜色封装的很完美,支持各种转换,比如rgb.hsb.cmy.hsl,对应的是toRgb.toHsv.toCmyk.toHsl,还支持透明度设置,颜色值还能转成16进制格式显示. ...

  2. Qt开发经验小技巧71-80

    在我们使用QList.QStringList.QByteArray等链表或者数组的过程中,如果只需要取值,而不是赋值,强烈建议使用 at() 取值而不是 [] 操作符,在官方书籍<C++ GUI ...

  3. Qt开发经验小技巧61-70

    很多人问Qt嵌入式平台用哪个好,这里统一回答(当前时间节点2018年):imx6+335x比较稳定,性能高就用RK3288 RK3399,便宜的话就用全志H3,玩一玩可以用树莓派香橙派. 对于大段的注 ...

  4. Qt开发经验小技巧41-50

    如果使用sqlite数据库不想产生数据库文件,可以创建内存数据库. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); ...

  5. Qt开发经验小技巧51-60

    在某些http post数据的时候,如果采用的是&字符串连接的数据发送,中文解析乱码的话,需要将中文进行URL转码. QString content = "测试中文"; Q ...

  6. Qt开发经验小技巧31-40

    代码判断MSVC编译器版本. if (_MSC_VER == 1800) MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015) MSVC++ 12.0 _ ...

  7. Qt开发经验小技巧21-30

    如果出现Z-order assignment: is not a valid widget.错误提示,用记事本打开对应的ui文件,找到为空的地方,删除即可. 善于利用QComboBox的addItem ...

  8. Qt开发经验小技巧11-20

    获取类的属性 const QMetaObject *metaobject = object->metaObject(); int count = metaobject->propertyC ...

  9. Qt开发经验小技巧1-10

    当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了. 定时器是个好东西,学会好使用它,有时候用QTime ...

  10. Qt开发经验小技巧合集

    一.开发经验总结 当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了. 定时器是个好东西,学会好使用它, ...

随机推荐

  1. Vue 的最大优势是???

    Vue 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合.另一方面,当与现代 ...

  2. 使用 KubeKey 在 AWS 高可用部署 Kubernetes

    作者:李耀宗 介绍 对于生产环境,我们需要考虑 Kubernetes 集群的高可用性.本文教您部署如何在多台 AWS EC2 实例快速部署一套高可用的生产环境.要满足 Kubernetes 集群服务需 ...

  3. Vue2.x 常用功能和方法

    Vue 生命周期 beforeCreate (组件实例刚被创建,组件属性计算之前,如 data 属性等) created (组件实例创建完成, 属性已绑定,但 DOM 还未生成, $el 属性不存在) ...

  4. Issac_GYM对Go2机器人的仿真心得

    override 覆盖 torques 扭矩 1 args()参数信息等 cd /home/yyds/桌面/Gym2/legged_robot_competition-master/legged_gy ...

  5. C++ stl锁的使用

    我们在日常开发中经常要用到锁,这里记录一下实际开发过程中stl提供的锁的使用. 1.读写锁 读写锁算是用到的比较多的一种类型,主要实现对于同一个共享数据区,一个时间点只能有一个线程进行写(增删改),但 ...

  6. 流程编排LiteFlow-业务代码解耦

    LiteFlow真的是相见恨晚啊,之前做过的很多系统,都会用各种if else,switch这些来解决不同业务方提出的问题,有时候还要"切一个分支"来搞这些额外的事情,把代码搞得一 ...

  7. 9.Kubernetes核心技术-Controller

    Kubernetes核心技术-Controller 内容 什么是Controller Pod和Controller的关系 Deployment控制器应用场景 yaml文件字段说明 Deployment ...

  8. getPropByPath:根据字符串路径获取对象属性 : 'obj[0].count'

    function getPropByPath(obj, path, strict) { let tempObj = obj; path = path.replace(/\[(\w+)\]/g, '.$ ...

  9. pytest框架之fixture

    1.在进行接口关联时,一般很多个接口共用一个上行接口(例如)登录,可以使用fixture定义一个测试夹具,将登录的接口写在框架的conftest.py文件中: @pytest.fixture(scop ...

  10. 关于meta-analysis的一些评论

    当提到meta-analysis,很多人的反应是,水文章的神器. 一方面是因为Meta分析作为系统综述里一个定量分析方法,能把各种研究结果有组织有纪律地综合起来,证据档次瞬间飙升,能甩传统综述好几条街 ...