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

news/2024/9/22 16:05:55/

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.ppmy.cn/news/1528902.html

相关文章

软考(9.22)

1 在浏览器的地址栏中输入xxxyftp.abc.can.cn&#xff0c;在该URL中( )是要访问的主机名。 A.xxxyftp B.abc C.can D.cn 协议://主机名.域名.域名后缀或IP地址(:端口号)/目录/文件名。 本题xxxyftp是主机名&#xff0c;选择A选项。 2 假设磁盘块与缓冲区大小相同&#xff0c;…

MySQL SQL语句中相关约束,详细展示

create table user ( #主键约束 主键是一行数据的唯一标识&#xff0c;要求非空且唯一&#xff0c;auto_increment 自动增长 id int primary key auto_increment comment主键,#非空约束 限制该字段的数据不能为null 唯一约束 保证该字段的所有数据都是唯一、不重复的 …

伊犁linux 创建yum 源过程

首先要创建yum 源这样后期的服务才能大面积部署 在su 用户下创建 清理缓存&#xff0c;一定要配置 这说明yum安装成功

【JavaSE系列】常用正则表达式汇总

目录 前言 一、校验数字的表达式 二、校验字符的表达式 三、特殊需求表达式 总结 前言 在软件开发和数据处理中&#xff0c;确保输入数据的正确性和一致性是非常重要的。正则表达式是一种强大的文本匹配工具&#xff0c;可以帮助开发者有效地验证和过滤各种格式的数据。本…

vue中提示Parsing error: No Babel config file detected

这个错误提示是在说&#xff1a;ESLint 尝试解析你的 .ts (TypeScript) 文件时&#xff0c;找不到 Babel 的配置文件。Babel 通常需要一个配置文件来告诉它如何解析现代 JavaScript 或 TypeScript 代码。以下是对错误信息的详细解释&#xff1a; “No Babel config file detect…

人工智能 | 基于ChatGPT开发人工智能服务平台

简介 ChatGPT 在刚问世的时候&#xff0c;其产品形态就是一个问答机器人。而基于ChatGPT的能力还可以对其做一些二次开发和拓展。比如模拟面试功能、或者智能机器人功能。 模拟面试功能包括个性化问题生成、实时反馈、多轮面试模拟、面试报告。 智能机器人功能提供24/7客服支…

【大模型实战篇】关于Bert的一些实操回顾以及clip-as-service的介绍

最近在整理之前的一些实践工作&#xff0c;一方面是为了笔记记录&#xff0c;另一方面也是自己做一些温故知新&#xff0c;或许对于理解一些现在大模型工作也有助益。 1. 基于bert模型实现中文语句的embedding编码 首先是基于bert模型实现中文语句的embedding编码&#xff0c;…

如何安装部署kafka

安装和部署Apache Kafka需要以下几个步骤&#xff0c;包括下载 Kafka、配置 ZooKeeper&#xff08;或者使用 Kafka 自带的 Kafka Raft 模式替代 ZooKeeper&#xff09;&#xff0c;以及启动 Kafka 服务。以下是一个但基于 Linux 的典型安装流程&#xff0c;可以根据需要改装到其…