Qt开发技巧(七)动态换图,QVideoWidget视频闪烁,Qt日志打印,系统消息处理,编译前后的操作,QSettings配置文件,屏幕自适应

1.动态换图
Qt开发时,有时候我们在界面上需要动态的切换图片,比如接到来自底层驱动的信号分成告警信号,正常信号,危险信号,在界面上使用QLabel通过贴图来表示不同的信号,这时候尽量使用setStyleSheet(),而不是setPixmap();
正常情况下你不会看到差别,但在某个特定条件下,你会发现不一样。比如你用QLabel显示上述不同信号的图片场景,当你使用setPixmap();来显示图片时,一旦你设置QLabel禁用,你会发现你图片的展示变成了一个很奇怪的背景了,而使用setStyleSheet();却不会被禁用干扰。

            QPixmap pixmap;QString strStyle;switch (state){case State_Normal:pixmap.load(":/image/Image/label_green.png");strStyle = QString("QLabel{border-image: url(:/image/Image/label_green.png)");break;case State_Warn:pixmap.load(":/image/Image/label_yellow.png");strStyle = QString("QLabel{border-image: url(:/image/Image/label_yellow.png)");break;case State_Danger:pixmap.load(":/image/Image/label_red.png");strStyle = QString("QLabel{border-image: url(:/image/Image/label_red.png)");break;}//第一种使用setPixmap方式,当myLabel禁用后会变样myLabel->setPixmap(pixmap);//第二种使用setStyleSheet方式,当myLabel禁用后不会变样myLabel->setStyleSheet(strStyle);

2.QVideoWidget视频播放
QVideoWidget播放视频,可能会遇到画面闪烁的情况,播放视频的窗体需要设置个属性来解决这个问题。

QVideoWidget *videoWidget = new QVideoWidget;
videoWidget->setAttribute(Qt::WA_OpaquePaintEvent);

3.Qt日志打印
Qt的调试功能其实很鸡肋,这就需要强大的日志辅助调试,Qt中想要打印日志,最简单的方式可以使用qDebug来打印调试,也可以使用其他几种打印信息比如 qInfo、qWarning、qCritical。

qDebug() << "qDebug";
qInfo() << "qInfo";
qWarning() << "qWarning";
qCritical() << "qCritical";

如果不想要看到一堆堆的打印信息,可以在工程文件中禁用。

#禁用qdebug打印输出
DEFINES += QT_NO_DEBUG_OUTPUT

这个宏会禁用qDebug输出,但qInfo、qWarning、qCritical不受影响。
如果需要长效的日志库,可以使用一些开源的第三方日志库,也可以自己写个日志库,这里推荐Qt的“log4qt”开源库,不仅可以打印用户写的日志,也能自行将Qt内部的一些警告错误打印出来,特别有助于分析问题。
在这里插入图片描述
4.系统消息处理
Qt对操作系统层的消息也做了很多的封装,可以直接拿到进行处理(如果需要拦截处理要用对应操作系统的API才行比如鼠标键盘钩子),比如系统休眠和唤醒做一些处理。

//主窗体头文件
protected:
//处理原生窗口系统事件
bool nativeEvent(const QByteArray &eventType, void *message, long *result);
#ifdef Q_OS_WIN
//处理windows系统事件
bool winEvent(MSG *message, long *result);
#endif//主窗体实现函数
#ifdef Q_OS_WIN
#include "Windows.h"
#endif
bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
if (eventType == "windows_generic_MSG")
{
#ifdef Q_OS_WIN
MSG *msg = static_cast<MSG *>(message);
//qDebug() << TIMEMS << msg->message;
if (msg->wParam == PBT_APMSUSPEND && msg->message == WM_POWERBROADCAST)
{
//系统休眠的时候自动最小化可以规避程序可能出现的问题
this->showMinimized();
} 
else if (msg->wParam == PBT_APMRESUMEAUTOMATIC) 
{
//休眠唤醒后自动打开
this->showNormal();
}
#endif
}
else if (eventType == "NSEvent")
{
#ifdef Q_OS_MACOS
#endif
}
return false;
}
#ifdef Q_OS_WIN
bool MainWindow::winEvent(MSG *message, long *result)
{
return nativeEvent("windows_generic_MSG", message, result);
}
#endif

5.编译前后的操作
Qt的.pro工程文件中提供了两个神奇的宏,可以在编译前和编译后分别做一些操作。
QMAKE_PRE_LINK 表示编译前执行内容
QMAKE_POST_LINK 表示编译后执行内容
比如下面这样执行一些拷贝操作

srcFile1 = $$PWD/1.txt
srcFile2 = $$PWD/2.txt
dstDir = $$PWD/../bin
#windows上需要转换路径斜杠 linux等其他系统不需要
srcFile1 = $$replace(srcFile1, /, \\);
srcFile2 = $$replace(srcFile2, /, \\);
dstDir = $$replace(dstDir, /, \\);
#编译前执行拷贝 多个拷贝可以通过 && 符号隔开
QMAKE_PRE_LINK += copy /Y $$srcFile1 $$dstDir && copy /Y $$srcFile2 $$dstDir
#编译后执行拷贝 多个拷贝可以通过 && 符号隔开
QMAKE_POST_LINK += copy /Y $$srcFile1 $$dstDir && copy /Y $$srcFile2 $$dstDir

6.QSettings配置文件
QSettings是Qt中专门处理配置类文件数据而做的(当然也可以处理其他业务),用好QSettings可以方便快捷的处理配置类的相关操作。操作时注意,最好都以UTF-8编码方式处理,可以极大地避免中文乱码的情况。甚至整个Qt开发都最好全部用UTF-8编码,既统一了编码方式,也避免了编码转换,还能密码乱码问题。

void App::readConfig()
{
QSettings set(App::ConfigFile, QSettings::IniFormat);
set.setIniCodec("utf-8");
set.beginGroup("MyConfig");
App::Company = set.value("version", App::version).toString();
set.endGroup();
}
void App::writeConfig()
{
QSettings set(App::ConfigFile, QSettings::IniFormat);
set.setIniCodec("utf-8");
set.beginGroup("MyConfig");
set.setValue("version", App::version);
set.endGroup();
}

7.屏幕自适应
在开发QT程序时,我们通常希望应用能够适应不同的屏幕分辨率,以确保用户在不同设备上都能够获得良好的使用体验。以下几种方式来处理不同分辨率下的自适应问题。
第一种:使用布局管理器:Qt提供了各种布局管理器,可以自动调整子控件的大小和位置以适应父控件的大小,从而实现适应屏幕的不同大小,有时候对有明显分辨率差异的屏幕效果很差。
第二种:使用QScreen和QDesktopWidget:获取当前屏幕的分辨率,并调整窗口大小以适应屏幕。
第三种:使用QResizeEvent:监听窗口大小改变事件,并在事件处理函数中实现自适应逻辑。
推荐使用第二种,根据屏幕的分辨率设置窗口大小,加之内部布局合理,这样比较容易适应屏幕。

//Qt启动高分屏的方法
int main(int argc, char *argv[])
{QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);//开启高缩放支持以后图片可能发虚还要开启下面这个属性QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);QApplication a(argc, argv);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/146758.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

和可被k整除的子数组问题

目录 一题目&#xff1a; 二思路&#xff1a; 三代码&#xff1a; 一题目&#xff1a; leetcode链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二思路&#xff1a; 思路&#xff1a;前缀和第二种表示方式即循环列出方式同余定理取模修正&#xff1a; 还是通…

这可能又是一款 Java 程序员的必备插件了,无需解压直接编辑修改 jar 包内文件,神器!(附源码)

作为一名 Java 程序员&#xff0c;在维护一些古老的程序时&#xff0c;可能会遇到这种情况&#xff1a;项目依赖的 jar 包过于久远&#xff0c;已经没有源码了&#xff0c;但是有不得不修改的 bug 要处理。这时候就得想办法反编译 jar 包进行修改&#xff0c;并且重新打包&…

Java反序列化利用链篇 | CC1链的第二种方式-LazyMap版调用链

文章目录 CC1链的第二种方式-LazyMap版调用链LazyMap构造payloadCC1的调用链 系列篇其他文章&#xff0c;推荐顺序观看~ Java反序列化利用链篇 | JdbcRowSetImpl利用链分析Java反序列化利用链篇 | CC1链_全网最菜的分析思路Java反序列化利用链篇 | CC1链的第二种方式-LazyMap版…

网站设计中安全方面都需要有哪些考虑

网站设计中的安全性是一个多方面的问题&#xff0c;需要从多个角度进行考虑和实施。以下是一些关键的安全考虑因素&#xff1a; 数据加密&#xff1a; 使用SSL&#xff08;安全套接字层&#xff09;证书来建立加密连接&#xff0c;确保数据在传输过程中不被截获。定期更新SSL证…

低空经济火爆,稀缺无人机教员培训详解

随着科技的飞速发展和低空经济的日益火爆&#xff0c;无人机技术已广泛应用于航拍、农业、物流、救援、环境监测等多个领域&#xff0c;成为推动社会经济发展的新引擎。然而&#xff0c;无人机行业的快速发展也催生了对专业无人机教员的迫切需求。本文将从基础理论学习、实操技…

制造业缺陷检测

制造业缺陷检测是一种在生产过程中检测和识别产品缺陷的技术。它旨在确保产品质量符合制定的标准&#xff0c;从而减少浪费、提高生产效率&#xff0c;并保证最终产品的安全性和可靠性。这种检测通常使用各种技术手段&#xff0c;包括但不限于&#xff1a; 视觉检测系统&#…

静态链表:实现、操作与性能优势【算法 16】

静态链表&#xff1a;实现、操作与性能优势 在算法和数据结构的探索中&#xff0c;链表作为一种基础且灵活的数据结构&#xff0c;广泛应用于各种场景。然而&#xff0c;在算法竞赛或需要高效内存管理的环境中&#xff0c;传统的动态链表可能会因为内存分配和释放的开销而影响性…

爆痘的分级和相应的处理

痘痘的分级 轻度 一级 无炎症性,粉刺总数不超过30个,有少量丘疹和脓疱中度 二级/三级 皮肤表面出现炎性丘疹损害,病损数为30-50个有中等数量的丘疹、脓疱 皮肤炎性损害加重,有大量丘疹和脓疱,并且伴有结节在三个以内,病损数为50-100个重度 四级 除炎性皮疹外,结节与囊肿为主…

SFUD库移植

1.源码 GitHub - armink/SFUD: An using JEDECs SFDP standard serial (SPI) flash universal driver library | 一款使用 JEDEC SFDP 标准的串行 (SPI) Flash 通用驱动库 2.介绍 这个通用驱动库,实际就是帮你封装好了读写spiflash的函数, 我们只需要对接以下底层,就可以轻松…

助力降糖新品“五菌膏”上市 科技特派员秋季行硕果累累

近日&#xff0c;武汉市“科技助力乡村振兴科技特派员秋季行活动”在武汉举行&#xff0c;此次活动由长江新区管委会、市科创局、武汉轻工大学主办&#xff0c;长江新区科技创新与成果转化局、武汉市科技成果转化促进中心、武汉市科技特派员创新联盟承办。 9月19日&#xff0c;…

VM虚拟机下载以及激活

传统的官网已经找不到下载了&#xff0c;这里我将下载好的放在阿里云盘&#xff0c;百度云盘太慢了&#xff0c;懂得都得 阿里云盘分享 下载好了后会是一个exe文件&#xff0c;直接双击运行就可 下载无脑下一步即可&#xff0c;这里不做介绍 下载好了后&#xff0c;需要密钥这里…

免费的AI测肤

AI测肤 https://beifuting.com/

实用好软-----电脑端 全能音视频转换器 转换各种音视频格式

软件介绍&#xff1a; 工具是一款免费的视频格式转换软件&#xff0c;支持几乎所有视频格式的转换&#xff0c;基本的有DVD, AVI, MP4, 3GP, WMV, ASF等格式。对于一些特殊格式的视频&#xff0c;不用担心看不到&#xff0c;除了保证转换质量&#xff0c;还能转换为你想要的类…

[图解]静态关系和动态关系

1 00:00:01,060 --> 00:00:04,370 首先我们来看静态关系和动态关系 2 00:00:06,160 --> 00:00:10,040 我们要尽量基于静态关系来建立动态关系 3 00:00:11,740 --> 00:00:13,740 不能够在没有这个的基础上 4 00:00:14,220 --> 00:00:17,370 没有这个的情况下就胡…

vue3 选择字体的颜色,使用vue3-colorpicker来选择颜色

1、有的时候我们会用到颜色的选择器&#xff0c;像element-plus提供了&#xff0c;但是ant-design-vue并没有&#xff1a; 这个暂时没有看到&#xff1a; 但是Ant Design 5的版本有&#xff0c;应该不是vue的。 2、使用第三方提供的vue3-colorpicker&#xff1a;storybook/cli…

《程序猿之设计模式实战 · 模板方法》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

NodeJs文档

文件操作 // 1. 导入fs模块 const fs require(fs)文件写入 //异步写入 // fs.writeFile(文件名&#xff0c; 待写入的数据&#xff0c; 选项设置&#xff08;可选&#xff09;&#xff0c; 回调函数) fs.writeFile(./座右铭.txt, 三人行&#xff0c;必有我师傅, err > {/…

专注并不意味只做一件事

原创内容第658篇&#xff0c;专注量化投资、个人成长与财富自由。 财务自由本身就是一个很有争议的领域。 有谁能靠别人实现财富自由呢&#xff1f; 这个逻辑起点本身就有问题。 如果预期正确&#xff0c;那这些自媒体还是有用处的。 好比我现在对于阅读和书籍的预期&…

看过来!这水凝胶,机械强、抗冻佳、导电优

大家好&#xff0c;如今智能穿戴设备越来越普及&#xff0c;但传统传感器有不少局限性。比如说&#xff0c;传统水基水凝胶用作柔性传感器材料时&#xff0c;保水性和抗冻性就不太好&#xff0c;这会影响其稳定性和应用范围。那有没有什么办法解决这些问题呢&#xff1f;今天我…

增强现实系列—Real-Time Simulated Avatar from Head-Mounte

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…