百摩网
当前位置: 首页 生活百科

qt编程技巧(Qt开发经验小技巧141-145)

时间:2023-08-01 作者: 小编 阅读量: 5 栏目名: 生活百科

以下内容大家不妨参考一二希望能帮到您!qt编程技巧141.QImage支持xpm图标,查看Qt内置的QStyle风格的代码中可以发现大量的xpm图标定义,通过代码的形式来产生图标,哇咔咔好牛逼。-第一步:代码文件选择用utf8编码带bom。-第三步:main函数中加入设置编码的代码,以便兼容Qt4,如果没有Qt4的场景可以不用,从Qt5开始默认就是utf8编码。

qt编程技巧?141. QImage支持xpm图标,查看Qt内置的QStyle风格的代码中可以发现大量的xpm图标定义,通过代码的形式来产生图标,哇咔咔好牛逼,接下来我们就来聊聊关于qt编程技巧?以下内容大家不妨参考一二希望能帮到您!

qt编程技巧

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)

    推荐阅读
  • 植物大战僵尸全明星紫色冰瓜投手(植物大战僵尸全明星玉米投手详解)

    植物大战僵尸全明星紫色冰瓜投手?小编告诉你玉米投手虽然是绿色品质,但是技能也很不错的哦攻击效果很准相当于百分百必死无疑啊,就是范围小,只能攻击最近一名敌人,想知道具体情况的请看下文植物大战僵尸全,现在小编就来说说关于植物大战僵尸全明星紫色冰瓜投手?相信大家有各种的疑问,那么现在就让我带来植物大战僵尸全明星玉米投手的详解吧!

  • 铠甲勇士的实力盘点(铠甲勇士中的5大胖子)

    乔奢费和安迷修比他长得帅,变身后库忿斯也是最丑的,但是库忿斯很牛逼可以召唤刑天、飞影、金刚铠甲。为获得长生不老,与路法大帝结盟。路法经常借用他的身体,在第二部中完全侵占了他的身体。但其对路法不满。

  • 最终幻想7重制版直播全过程(中字走进最终幻想7)

    距离发售还有三周的时间,SquareEnix出品了一部名为“走进《最终幻想7重制版》”的官方纪录片,为游戏的发售预热。视频地址在访谈中,北濑佳范表示最早是在2012年开始考虑重制《最终幻想7》的,他随后找来了野村哲也和桥本真司商谈,三人很快就达成共识,确定了计划。一定程度上来说,《圣子降临》是《最终幻想7重制版》的核心之一。

  • 女生与你聊了几句就说晚安(女人晚上和你聊天结束的时候)

    一个喜欢你的人怎么会舍得冷落你呢?这一定是她生命中最开心的事情,因为这证明了你爱她。你的三餐,你的饮食健康,你的生活规律都排在她的第一位。所以不管晚上的时候她多么的寂寞,多么的想跟你继续聊下去,她都会拼命的克制自己,而是提醒你早点休息别熬夜。她选择在夜晚将要入睡的时候向你表达爱意,因为她希望你能够伴随着她的爱入睡。

  • iphone怎么批量删除通讯录联系人(iphone如何批量删除通讯录联系人)

    首先先进入设置,打开苹果ID,点击“iCloud”,下面我们就来说一说关于iphone怎么批量删除通讯录联系人?我们一起去了解并探讨一下这个问题吧!之后关闭“通讯录”后的按钮开关,选择下方弹出选项中的“从我的iPhone删除”即可完成。

  • pdcch信道是由什么组成(pdcch信道的功能)

    pdcch信道是由CCE组成,不同的控制信道格式规定了不同的CCE数目。PhysicalDownlinkSharedChannel:物理下行共享信道,物理下行共享信道用于承载来自传输信道DSCH的数据。在下行方向,传输信道DSCH不能独立存在,只能与FACH或DCH相伴而存在,因此作为传输信道载体的PDSCH也不能独立存在。DSCH数据可以在物理层进行编码组合,因而PDSCH上可以存在TFCI,但一般不使用SS和TPC,对UE的功率控制和定时提前量调整等信息都放在与之相伴的PDCH信道上。

  • 10秒钟看懂血常规化验单(教你看懂血常规化验单)

    一旦送往医院,最常见的就是查体之后的抽血检查血常规了,这些辅满数字、又花花绿绿的检验单,却经常让妈妈们一头雾水。通常急性高热主要由感染所致,但在发热的24小时内进行血液检查不易判断感染的性质。白细胞增高是人体对细菌侵犯的一种反应。血常规化验结果需配合临床分析才有意义血常规化验不是定性诊断试验,结果必须结合临床分析才有意义。轻微超出正常范围并不一定具有临床意义。

  • 减肥适合吃的粗粮(最减肥的居然是它)

    从热量上讲每100克玉米的热量是196大卡200大卡都不到!减肥就定薏米了!

  • 1分钟带你读懂水浒传(水浒传原汁原味读经典)

    宋江怀中取出书来,递与那人。便是吴学究所荐的江州两院押牢节级戴院长戴宗。因此人都称做神行太保戴宗。当下戴院长与宋公明说罢了来情去意,戴宗、宋江俱各大喜。宋江诉说一路上遇见许多好汉,众人相会的事务,戴宗也倾心吐胆,把和这吴学究相交来往的事,告诉了一遍。戴宗便起身下去,不多时引着一个黑凛凛大汉上楼来。戴宗要阻当时,宋江已把出来了。以强凌弱真堪恨,天使拳头付李逵。

  • 看到一个网站用英语怎么说(网址www.的34)

    pointpointn.观点;重点;要点;点point更偏向抽象意义上的点,比如论点、观点、重点等。小嗨就简单给大家讲一下spot名词中和“点”相关的意思。(想知道spot更详细的意思,点击留言区置顶的链接吧!但spot也可以表示皮肤上或皮毛上的斑点、胎记,或是让人讨厌的丘疹、粉刺等皮肤问题。spot的点,是非常具体的斑点、污渍等,所以也不是用spot表示网址中的点"."哦!dot的最常见的意思是点、小点、小圆点,英文解释是asmallroundmarkorspot。