unix qt 与 windows qt的用法差异

Posted 刘达人186

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unix qt 与 windows qt的用法差异相关的知识,希望对你有一定的参考价值。

1. QT样式表设置背景色 background-color无效的原因

QPushButton
 {
       background-color: red;
}

结果发现,按钮的背景色并没有被设置为红色!

问题的原因,QT的帮助文档里讲了,比较难找,打开帮助文档,依次展开->style sheet->Qt Style Sheets Reference,找到表格中的QPushButton,如下图所示

 

 


大体意思就是,要想使背景色生效,必须要设置一下某个border属性,border-color、border-width等等任何一个跟border相关的属性都行。因为pushbutton的原生边界把背景色给覆盖住了。

 

 

    accountLoginButton->setStyleSheet("background-color:transparent;border:none;");//设置QListWidget背景色为透明
    uniteLoginButton->setStyleSheet("background-color:transparent;border:none;");//设置QListWidget背景色为透明

 

 

 

 

 

2. Qt窗体设置Qt::WA_TranslucentBackground为全黑的原因

背景漆黑的部分其实就是透明的部分...大多是因为桌面没有设置成32色导致的

你的桌面是32色的么?
还有你安装了显卡驱动了么?
背景漆黑的部分其实就是透明的部分...

如果要想要半透明效果应该用setWindowOpacity,WA_TranslucentBackground是背景透明控件不透明的效果。

 

 

    //TODO,still has border
    //设置窗体透明
    if(operateSystem=="windows"){
        this->setAttribute(Qt::WA_TranslucentBackground, true);
    }else{
        this->setWindowOpacity(0.0);
//        this->setAttribute(Qt::WA_TranslucentBackground, false);
//        this->setStyleSheet("background-color:rgba(0, 0, 0, 0);border:none;");
    }

 

 

 

 

------解决方案--------------------
setWindowOpacity(0.5);
------解决方案--------------------
一般要把窗体设置为FramelessWindowHint属性,WA_TranslucentBackground才能生效。如果要想要半透明效果应该用setWindowOpacity,WA_TranslucentBackground是背景透明控件不透明的效果。

 

在Qt中,设置窗体透明度的函数有:void   setWindowOpacity(qreal level)

特性:
    透明度的有效范围从1.0(完全不透明)到0.0(完全透明的)。
    默认情况下,此属性的值是1.0。(也就是不透明状态)
    这个特性可以在嵌入式Linux、Mac OS X、Windows、和X11平台上使用。
    此功能不可用在Windows CE。
    还要注意,半透明的windows更新和调整明显慢于不透明的窗口。(透明窗体的刷新速度会变慢)

 

qt在linux下设置widget透明的方法

Qt参考文档
Platform notes:
X11: This feature relies on the use of an X server that supports ARGB visuals and a compositing window manager.
Windows: The widget needs to have the Qt::FramelessWindowHintwindow flag set for the translucency to work.

平台注意事项:
X11(linux):此特性依赖于能提供支持ARGB视觉效果和复合式视窗管理的X服务的功能开启。
Windows:此控件需要设置窗口标志Qt::FramelessWindowHint才能开启透明功能。

在windows上设置widget属性
setWindowFlags(Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground,true);
可以实现透明功能,但是在linux上需要安装渲染工具compiz 方法如下:
root用户下: yum install compiz
运行:compiz --replace &

 3. linux qt QSystemTrayIcon不支持

https://forum.qt.io/topic/54004/qsystemtrayicon-in-linux/7

 

 

     //TODO
     QSystemTrayIcon *trayicon = new QSystemTrayIcon();

 

4. Linux QT

QComboBox选择框被挡住原因

 

5. 查看有没安装浏览器等软件

windows下查看注册表即可

linux下需要使用命令行

 

在linux平台下,我们很容易想到用命令:ps -a | grep processName来对进程进行查找。进而想到用QProcess来执行这一个命令。

然而遗憾的是,QProcess不提供对管道的支持,这里我们采用一个变通的方法:利用 sh 来执行上面的命令。

 

代码如下:

QProcess ps;

connect(&ps,SIGNAL(readyReadStandardOutput()),this,SLOT(readProcessStandardOutput()));

QStringList args;

args<<"-c";

args<<"ps | grep \'processName";

ps.start("sh",args);

 

readProcessStandardOutput()

{

   ps.readAllStandardOutput()   // 得到sh -c "ps | grep \'processName‘“ 的输出结果,查看这个结果就可以得到这个结果是否在运行。

}

 

linux下如何查看某软件是否已安装

因为linux安装软件的方式比较多,所以没有一个通用的办法能查到某些软件是否安装了。总结起来就是这样几类:

1、rpm包安装的,可以用rpm -qa看到,如果要查找某软件包是否安装,用 rpm -qa | grep “软件或者包的名字”。

1
[root@hexuweb102 ~] rpm -qa | grep ruby

2、以deb包安装的,可以用dpkg -l能看到。如果是查找指定软件包,用dpkg -l | grep “软件或者包的名字”;

1
[root@hexuweb102~]dpkg-l|grepruby

3、yum方法安装的,可以用yum list installed查找,如果是查找指定包,命令后加 | grep “软件名或者包名”;

1
[root@hexuweb102 ~] yum list installed | grep ruby

4、如果是以源码包自己编译安装的,例如.tar.gz或者tar.bz2形式的,这个只能看可执行文件是否存在了,

上面两种方法都看不到这种源码形式安装的包。如果是以root用户安装的,可执行程序通常都在/sbin:/usr/bin目录下。

说明:其中rpm yum 是Redhat系linux的软件包管理命令,dpkg是debian系列的软件包管理命令

 


6. 打开程序

windows下

QProcess *p = new QProcess(this);

p->startDetached(installerSuccessLaunchCmdLine, QStringList() << "/c" << systemLoginHomePage);

 

linux下

QProcess *p = new QProcess(this);
p->startDetached("/opt/chromium.org/chromium/chromium-browser", QStringList() << systemLoginHomePage);

 

以上是关于unix qt 与 windows qt的用法差异的主要内容,如果未能解决你的问题,请参考以下文章

Windows 和 Linux 在 QT 中的形式差异

qt卡在消息循环

Qt 如何枚举屏幕?

虚函数表:QT5与VS2015的差异

什么是 QT 插件?

QDir类及其用法总结