百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

Qt开发经验小技巧141-145_qt开发教程

yund56 2025-03-02 19:34 17 浏览

141. QImage支持xpm图标,查看Qt内置的QStyle风格的代码中可以发现大量的xpm图标定义,通过代码的形式来产生图标,哇咔咔好牛逼。

```cpp

static const char * const imgData[] = {

"15 11 6 1",

" c None",

"+ c #979797",

"@ c #C9C9C9",

"$ c #C1C1C1",

"b c None",

"d c None",

" $++++++++$ ",

"$+bbbbbbbb+$ ",

"+b $$ +$ ",

"+b $@ +$ ",

"+b +$",

"+b d+",

"+b d+$",

"+b $$ d+$ ",

"+b $@ d+$ ",

"$+dddddddd+$ ",

" $++++++++$ "};

//这样就能直接显示一个箭头的图形

QImage img(imgData);

QLabel lab;

lab.setPixmap(QPixmap::fromImage(img));

lab.show();

```

142. 在停靠窗体QDockWidget和QOpenGLWidget同时使用的时候,从嵌入状态切换到浮动状态或者浮动状态切换到嵌入状态,QOpenGLWidget的上下文会被打乱导致白屏失效,需要在main函数中开头位置设置下共享OpenGL上下文。

```cpp

int main(int argc, char *argv[])

{

//需要设置共享上下文不然停靠窗体从正常到浮动后QOpenGLWidget窗体会失效

#if (QT_VERSION > QT_VERSION_CHECK(5,4,0))

QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts);

#endif

QApplication a(argc, argv);

...

}

```

143. 关于Qt中文乱码的问题,个人也稍微总结了一点,应该可以解决99%以上的Qt版本的乱码问题。

- 第一步:代码文件选择用utf8编码带bom。

- 第二步:在有中文汉字的代码文件顶部加一行(一般是cpp文件) #pragma execution_character_set("utf-8") 可以考虑放在head.h中,然后需要的地方就引入head头文件就行,而不是这行代码写的到处都是;这行代码是为了告诉msvc编译器当前代码文件用utf8去编译。

- 第三步:main函数中加入设置编码的代码,以便兼容Qt4,如果没有Qt4的场景可以不用,从Qt5开始默认就是utf8编码。

```cpp

void QUIHelper::setCode()

{

#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))

#if _MSC_VER

QTextCodec *codec = QTextCodec::codecForName("gbk");

#else

QTextCodec *codec = QTextCodec::codecForName("utf-8");

#endif

QTextCodec::setCodecForLocale(codec);

QTextCodec::setCodecForCStrings(codec);

QTextCodec::setCodecForTr(codec);

#else

QTextCodec *codec = QTextCodec::codecForName("utf-8");

QTextCodec::setCodecForLocale(codec);

#endif

}

```

144. 关于Qt众多版本(至少几百个)都不兼容的问题,在经过和Qt中国的林斌大神和其他大神(Qt非官方技术交流群)头脑风暴以后,最终得出以下的结论。

- Qt在二进制兼容这块,已经做了最大的努力,通过将各种代码细节隐藏,Q指针+D指针技巧,尽量保持了接口的统一;

- 是否兼容最主要考虑编译器的因素,毕竟任何Qt版本都是需要通过编译器编译成对应的二进制文件,由他说了算。如果两个Qt版本采用的编译器版本一样,极大概率可执行文件是兼容的,比如 Qt5.10+msvc2015 32 位 和 Qt5.11+msvc2015 32位 编译出来的可执行文件,都用Qt5.11的库是可行的;

- mingw编译器的Qt版本也是如此,就是因为Qt官方安装包集成的mingw编译器一直在更新(极少附近版本没有更新mingw编译器版本除外),比如5.7用的mingw53,5.12用的mingw73,5.15用的mingw81,因为带的Qt库也是这个编译器编译出来的,所以导致看起来全部不兼容;

- 如果想要完全兼容,还有一个注意要素,那就是对应代码使用的类的头文件接口是否变了,按道理原有的接口极少会变,一般都是新增加,或者大版本才会改变,比如Qt4-Qt5-Qt6这种肯定没法兼容的,接口和模块都变了;

- 大胆的猜测:如果Qt5.6到Qt5.15你全部用一种编译器比如mingw73或者msvc2015重新编译生成对应的Qt运行库,然后在此基础上开发程序,最后生成的可执行文件用Qt5.15的库是都可以的,这样就轻松跨越了多个版本兼容;

- 大胆的建议:在附近的几个版本统一编译器,比如5.6-5.12之间就统一用mingw53或者msvc2015,5.12-5.15统一用msvc2017,要尝鲜其他编译器的可以自行源码编译其他版本,这样最起码附近的一大段版本(大概2-3年的版本周期)默认就兼容了。

- 本人测试的是widget部分,qml未做测试,不清楚是否机制一样;

145. 通过酷码大哥(Qt开发者交流群)的指点,到今天才知道,Qt设置样式表支持直接传入样式表文件路径,亲测4.7到5.15任意版本,通过查看对应函数的源码可以看到内部会检查是否是 'file:///' 开头,是的话则自动读取样式表文件进行设置,无需手动读取。

```cpp

//以前都是下面的方法

QFile file(":/qss/psblack.css");

if (file.open(QFile::ReadOnly)) {

QString qss = QLatin1String(file.readAll());

qApp->setStyleSheet(qss);

file.close();

}

//其实一行代码就行

qApp->setStyleSheet("file:///:/qss/psblack.css");

```

Qt开发经验开源主页(持续更新):

1. [https://gitee.com/feiyangqingyun/qtkaifajingyan](https://gitee.com/feiyangqingyun/qtkaifajingyan)

2. [https://github.com/feiyangqingyun/qtkaifajingyan](https://github.com/feiyangqingyun/qtkaifajingyan)

相关推荐

Vlookup函数的16种经典用法

...

一对多查询难倒了很多人,教你使用vlookup轻松搞定它

Hello,大家好,提高一对多查询,相信很多人都会想到index+if+small这个函数组合,但是这函数组合是一个数组公式,实际理解起来还是比较难的,今天跟大家分享一种更加简单的方法,解决一对多查询...

巧用Vlookup公式,批量指定次数重复数据

老板发给你左边的表格,对应员工姓名以及次数,让你快速转换成右边的格式,按指定的次数分别重复数据这个问题,也可以使用万能的VLOOKUP公式快速完成,分别利用VLOOKUP的精确查找和模糊查找完成方法1...

两份Excel表格核对数据差异,vlookup函数五秒搞定,你会用吗?

相信大家在工作的时候,经常会碰到一个问题,那就是我们当我们接受到别人发过来的数据的时候,我们需要核对别人的数据名单和我们的是否一致。如果数据有问题,那可能就涉及重做的情况。如上图所示,我们文件夹中有表...

vlookup单个数据查询已经Out了,搭配Match函数乱序查找才算高效

vlookup函数相信我们大家都不陌生,它在Excel数据查询中是一个非常实用的函数。通过vLookup函数可以查询到我们精确查询出我们需要的各种数据。但是vlookup也有局限性那就是一次只能查询单...

VLOOKUP公式,搭配通配符,查找无敌!

工作中,经常要用VLOOKUP公式来进行查找匹配,但是有时候,我们的数据源并不是完全匹配的,有时候有缩写和全称之分,例如,左边是全称的公司名称,右边需要根据公司的简称,快速的查找匹配对应的代码方法一:...

Vlookup函数公式,结果是45648,你得知道的小细节

举个工作中的实例,我们有一个数据源,记录了订单号的送达时间,其它不必要的数据我们将它进行了删除,只保留了A:B两列。现在需要根据给出的订单号码,快速匹配出来送达时间,如下所示:面对这种查找匹配问题,我...

vlookup函数的使用方法及实例

VLOOKUP主要功能是根据被查找值,在查找的数据源区域按列查询,并返回指定列数下所对应的值。下面我们一起来看看vlookup函数的使用方法吧!一、vlookup公式的写法=VLOOKUP(Looku...

难怪Vlookup没人用了,Xlookup公式也太厉害了!

工作中,遇到查找匹配问题,我们第一时间,想到的是VLOOKUP公式例如,左边是员工人事工资表数据,现在需要根据员工姓名,匹配工资数据这里我们直接使用的是:=VLOOKUP(F2,B:D,3,0)但是,...

VLOOKUP公式真是万能的,还能批量指定次数重复数据

如下所示,左边是原始数据,我们需要根据重复的次数,弄成右边这种样子数据较少用复制粘贴是可以的,但是如果数据比较多的话,用复制粘贴可以让你崩溃,今天教大家两种方法来解决上面的重复次数问题1、技巧法首先我...

Vlookup公式,结合IF(1,0)两种用法,老板夸你厉害

打工人天天要用的Vlookup公式,必须要熟练各种用法,今天分享Vlookup结合IF({1,0})的两种用法1、逆向查找匹配举个例子,左边是员工工资数据,需要根据姓名,查找匹配员工编号但是在原始数据...

Vlookup公式跨多表查询,太牛了,1分钟学会

举个工作中的例子,我们有3张工作表,分别记录了一些不同分部的员工工资表数据然后我们在总表中,有一些员工,需要快速查找匹配他们的工资数据。这些员工可能存在于任意一个工作子表有2种方法快速跨多表查找方法一...

Vlookup新用法!批量查询多个结果,你绝对没用过

今天跟大家分享下如何在不规则的表格中使用Vlookup来实现批量的查询数据,效果如下图,这个操作最关键的就是【Ctrl+回车】快捷键!一、定位空白单元格首先我们需要先选中需要输入公式的单元格中,这个操...

秒杀Vlookup公式,不限版本,必学公式组合

打工人,几乎天天都要遇到查找匹配问题,我们第一选项就是VLOOKUP公式确实很方便,输入4个参数可以查找匹配:1、传统VLOOKUP公式例如,根据姓名,匹配工资数据我们只需要输入的公式是:=VLOOK...

Excel批量查询多行、多列数据,vlookup&amp;Match函数嵌套轻松搞定

说到数据查询,相信许多人首先想到的就是vlookup函数。vlookup在数据查询过程中的作用确实非常大,什么单条件、多条件及逆向查询操作都能完成。但是在使用的时候,有时候单独使用这个函数也会出现很多...