前言
qt为我们提供了两种定制样式的方法——qss和qstyle,大部分developer都使用qss定制样式,但有时也会碰到一些奇怪的问题,而qstyle虽然可以进行更深层次的定制,但相对难用,所以使用qstyle进行整体样式定制的方法就变得小众,但除了对整体样式的定制,qstyle还有一些其它的妙用,最常见的是在itemdelegate里绘制某个控件。
虽然说在linux下我们建议使用系统样式而非自定义样式,但商业软件开发似乎永远也逃不出自定义样式的定势,哪怕自定义之后的样式可能还不如用户系统的样式。尤其像deepin、uos等系统的默认桌面系统和样式对各种控件进行了深度定制,很多控件与常见的样式已经有很大的差别,这导致使用qss定制样式的程序跑在这样的环境之下的一些控件会变得面目全非,比如qspinbox
这样放到测试那里肯定是要报bug的,而想要用qss纠正这样的“bug”似乎也非常困难,事实上其原因就是因为qt程序会加载系统的当前样式,并作为每个控件的默认样式,而用于加载系统样式的就是qstyle这一机制。
实施方法:
1.查看系统支持的样式
新建一个qt程序,并加入如下代码
-
#include <QDebug>
-
#include <QStyleFactory>
-
qDebug() << QStyleFactory::keys();
编译执行,这时,命令行会输出当前系统所支持的style
对于linux用户,你的系统可能会有“GTK+”、“Windows”、“Fusion”等style。
2.选定style,并设置为程序的style
你要尽可能选择常见的style,以尽可能多地覆盖到所有桌面系统中,比如我刚才提到的“GTK+”、“Windows”、“Fusion”都是linux系统中比较常见的style。
然后在你的main.cpp加入如下代码:
-
QApplication a(argc, argv);
-
QStyle *style = QStyleFactory::create("GTK+");
-
if (style == nullptr)
-
{
-
style = QStyleFactory::create("Windows");
-
}
-
if (style == nullptr)
-
{
-
style = QStyleFactory::create("Fusion");
-
}
-
if (style == nullptr)
-
{
-
style = new QCommonStyle;
-
}
-
a.setStyle(style);
最后的commonstyle是为了防止这三种style都没有的情况,当然,你也可以直接创建QCommonStyle
而不考虑用户系统有什么,只不过QCommonStyle
需要做的定制工作要多一些,当然,这样程序的适应性也会更好一些。
版权声明:本文乃pl014
原创文章,如需转载,请注明出处。
阅读(1505) | 评论(0) | 转发(0) |