Qt样式表踩坑小记

Posted 桑底坡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt样式表踩坑小记相关的知识,希望对你有一定的参考价值。

在一个项目里使用样式表修饰界面,最终实现的效果不错,坑也踩了不少,浪费好几天时间。

坑 1 :样式表的字符集。

这个问题只在MSVC里出现,使用MinGW应该不会出现这个问题。qt的默认字符集是utf8,但msvc要求源码必须是ANSI或者带BOM的Utf8,所以一般我们在做msvc项目时,把Qt环境配置编辑器->文本->
行为->utf8-bom选项,改为Add If encoding Is Utf-8,这样默认保存的格式msvc才可以正常编译。直接从MinGW项目复制过来的文件无法编译,因为msvc无法正常解析非Bom的utf8。
文件都以utf8-bom保存之后,msvc可以正常编译,但同时样式表的问题就出来了。
本来样式表是好使的,然后不知怎么突然就不好使。各种尝试,各种排查,最后发现是字集的问题。qt在解析样式表的时候不认utf8-bom,他把文件开头的bom识别成一个特殊字符,然后整个样式表就全部失效。
解决办法起初使用第三方编辑器把css文件保存成utf8或者ANSI格式,每次修改都这么操作太麻烦,最后用QCodec解决一下。

QFile qssFile(":/style.css");//样式表保存在资源文件
if(qssFile.open(QFile::ReadOnly))

//原始格式读出
QString qss = QString::fromLatin1(qssFile.readAll());
//生成一个GBK编码器
QTextCodec *codec = QTextCodec::codecForName("GBK");
//从unicode转换为gbk
QString qs = QString(codec->fromUnicode(qss));
//整个app都使用此样式表

qApp->setStyleSheet(qs);
qssFile.close();

这样用内置编辑器可以直接编辑 css文件,直接保存不需要额外处理。

坑 2 :自定义组件样式表无效

这是一个动态管理的界面,程序运行时读取配置文件,根据配置文件确定界面显示内容。为简化构造界面的代码,我把几个固定搭配的组件封装成单独的类,但系统样式表对自定义组件类里的成员不起作用。上网检索,得到答案是自定义类需要实现一下重绘事件。

#include <QStyleOption>
#include <QPainter>
.
.
.

void MyClass::paintEvent(QPaintEvent *event)

Q_UNUSED(event);
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);

坑 3 :样式表写的到处都是

发生这个问题主要是因为前面排错没头绪又赶时间,为了实现效果就在代码里需要样式表的地方直接用了Widget->setStyleSheet(.....);这样的写法。
在解决坑 1和坑2 问题之后,样式表是起了作用,但实际运行结果乱的一团糟,毫无规律 。于是拆除了所有夹在代码里的setStyleSheet,终于一切都正常。

本来我理解这个样式表的层叠,应该是后的覆盖前的,同一个组件,后来定义的时候只写和前面不一样的就行,但程序代码夹进样式表之后就不是这样了。

 

另外,如果自定义组件成员需要单独设置,可以用下面几种写法,以QPushButton为例。

MyClass QPushButton...
MyClass > QPushButton...

还可以在自定义类中生成Widget后进行设置一个属性,比如有个名字pb1的按钮,
pb1->setProperty("myButton","config");

在css文件里可以用
QPushButton[myButton="config"]
的写法访问。

但是MyClass QPushButton#pb1...
这样的写法无效。

Laravel踩坑小记

背景:
使用laravel项目的命令行惊现错误
php artisan companyCustomerStatisticsCommand

In Connection.php line 664:

  could not find driver (SQL: select max(`customer_id`) as aggregate from `statistic_customer`) 

排查:
1.浏览器直接访问项目,数据库均能正常访问
2.浏览器查看phpinfo(), 获取到php版本信息
PHP Version 7.2.11-2+ubuntu18.04.1+deb.sury.org+1
3.php -v查看php客户端版本
PHP 7.3.0RC3 (cli) (built: Oct 15 2018 11:37:12) ( NTS )


思考:
php客户端根php-fpm版本不一致
phpinfo()可以看到php-fpm中已经加载mysql扩展.
php命令行php -m | grep mysql无结果,故缺少php客户端版对应的mysql扩展php7.3-mysql


解决过程:
sudo apt-get install php7.3-mysql

以上是关于Qt样式表踩坑小记的主要内容,如果未能解决你的问题,请参考以下文章

算法踩坑小记

Ubuntu 16.04 安装Mysql 5.7 踩坑小记

GO语言map类型interface{}转换踩坑小记

Vue.js 升级踩坑小记

async语法升级踩坑小记

HTTP访问控制(CORS)踩坑小记