背景
用QT开发了一个界面程序(名为test),通过QSS为其指定了widget样式,瞬间感觉程序高大上起来了。但经过几种情况的测试,发现不同的运行方式在Ubuntu上显示的样式效果是不一样的。如下:
1.双击直接运行程序 结果:界面与预期一致
2.在shell中执行 $./test 结果:界面与预期一致
3.在shell中执行 $sudo ./test 结果:界面部分样式生效,有些样式没有显示出来
具体到我的情况,是QTreeWidget中Item的复选框边框显示不正常,如下图所示:图1为正常显示,图2为不正常
解决方法
翻看项目代码,发现前辈写的程序在shell中是这样使用的:
$sudo ./test -style=gtk+用同样的方法进行验证,果然可以!!!
经过一翻搜索发现,在程序中也可以直接通过如下方式达到同样效果:
qApp->setStyle("gtk+")
再看setStyle,该函数可以接受一个字符串(style名称),通过QStyleFactory创建不同的QStyle对象,然后应用到QApplication。通过代码:/opt/Qt5.5.1/5.5/Src/qtbase/src/widgets/styles/qstylefactory.cpp可以看到支持的style有如下几种:
问题分析
之所以出现不指定style时,界面显示差异,还是怀疑是环境变量的问题。
在程序中增加QProcess::systemEnvironment取得环境变量,分别对比上述三种操作的环境变量差异,发现前两种的环境变量相同,都有一个变量:
GTK_Modules=overlay-scrollbar:unity-gtk-module
而第三种操作明显少了很多变量,并且没有GTK_Modules变量,这或许是问题所在,但目前未找到验证方法。
暂时先到这里。哪位知道原因或方法的请告知一下~
原文链接:https://www.f2er.com/ubuntu/355706.html