Qt Style Sheet实践(三):QCheckBox和QRadioButton

来源:互联网 发布:go并发编程实战 源码 编辑:程序博客网 时间:2024/06/04 04:59

http://3y.uu456.com/bp_1zsm26for59f98i84ny5_1.html


导读;单选按钮(QRadioButton)和复选框(Q;基本实现;单选按钮(;QRadioButton)的基本特征是互斥;效果还不错,朴素简单;如何进行样式定制呢?QRadioButton定制;QRadioButton::indicator{;width:13px;;height:13px;;QRadioButton::indicator:;image:ur

<iframe id="iframeu1057021_0" src="http://pos.baidu.com/ncpm?rdid=1057021&amp;dc=2&amp;exps=112007&amp;di=u1057021&amp;dri=0&amp;dis=0&amp;dai=4&amp;ps=561x370&amp;dcb=BAIDU_SSP_define&amp;dtm=HTML_POST&amp;dvi=0.0&amp;dci=-1&amp;dpt=none&amp;tsr=0&amp;tpr=1467374848748&amp;ti=12Qt%20Style%20Sheet%E5%AE%9E%E8%B7%B5(%E4%B8%89)%EF%BC%9AQCheckBox%E5%92%8CQRadioButton&amp;ari=2&amp;dbv=2&amp;drs=1&amp;pcs=1017x547&amp;pss=1017x574&amp;cfv=0&amp;cpl=5&amp;chi=1&amp;cce=true&amp;cec=GBK&amp;tlm=1467374849&amp;rw=547&amp;ltu=http%3A%2F%2F3y.uu456.com%2Fbp_1zsm26for59f98i84ny5_1.html&amp;ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DO6hrRfQ1EiOUP6caCZ-fOxBhskbocfb5H9U7gFebYYU8uXFdll5wLK60BYDn9ygTQDJRRBjEenMXxD5Y5YetE_%26wd%3D%26eqid%3D9097fd19000226660000000657765afb&amp;ecd=1&amp;psr=1366x768&amp;par=1366x728&amp;pis=-1x-1&amp;ccd=24&amp;cja=false&amp;cmi=7&amp;col=zh-CN&amp;cdo=-1&amp;tcn=1467374849&amp;qn=757ed64743aa8c00&amp;tt=1467374848730.470.596.597" width="336" height="280" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="border-width: 0px; border-style: initial; vertical-align: bottom; margin: 0px;"></iframe>
<iframe id="iframeu1057021_1" src="http://pos.baidu.com/ncpm?rdid=1057021&amp;dc=2&amp;exps=112007&amp;di=u1057021&amp;dri=1&amp;dis=0&amp;dai=5&amp;ps=561x620&amp;dcb=BAIDU_SSP_define&amp;dtm=HTML_POST&amp;dvi=0.0&amp;dci=-1&amp;dpt=none&amp;tsr=0&amp;tpr=1467374848748&amp;ti=12Qt%20Style%20Sheet%E5%AE%9E%E8%B7%B5(%E4%B8%89)%EF%BC%9AQCheckBox%E5%92%8CQRadioButton&amp;ari=2&amp;dbv=2&amp;drs=1&amp;pcs=1017x547&amp;pss=1017x586&amp;cfv=0&amp;cpl=5&amp;chi=1&amp;cce=true&amp;cec=GBK&amp;tlm=1467374849&amp;rw=547&amp;ltu=http%3A%2F%2F3y.uu456.com%2Fbp_1zsm26for59f98i84ny5_1.html&amp;ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DO6hrRfQ1EiOUP6caCZ-fOxBhskbocfb5H9U7gFebYYU8uXFdll5wLK60BYDn9ygTQDJRRBjEenMXxD5Y5YetE_%26wd%3D%26eqid%3D9097fd19000226660000000657765afb&amp;ecd=1&amp;psr=1366x768&amp;par=1366x728&amp;pis=-1x-1&amp;ccd=24&amp;cja=false&amp;cmi=7&amp;col=zh-CN&amp;cdo=-1&amp;tcn=1467374849&amp;qn=dc8f675758705319&amp;tt=1467374848730.496.724.725" width="336" height="280" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="border-width: 0px; border-style: initial; vertical-align: bottom; margin: 0px;"></iframe>

导读

单选按钮(QRadioButton)和复选框(QCheckBox)是界面设计中的重要元素。单选按钮只允许用户在一组选项中选择一个,且当其中一个被选中的时候,按钮组中的其他单选按钮自动取消。复选框则可以让用户同时选中多个选项,这在多项选择的情况下非常有用。此外,复选框经过设置还具备第三种状态:未决状态(partially checked)。单选按钮和复选框应用广泛,在WEB表单、软件配置界面常常是不可或缺的元素。这篇博文主要讲述Qt中单选按钮和复选框如何通过样式表进行外观定制。

基本实现

单选按钮(

QRadioButton)的基本特征是互斥。当一个按钮选中,系统自动取消其他按钮的选中状态。当然,前提是这些按钮都要放置同一个父组件(Parent Widget)中。我们简单的用Qt Designer拖个按钮组,按Ctrl+R进行预览:

效果还不错,朴素简单。在这里,我们将一组单选按钮全部放到了一个QGroupBox里面。这样,当一个按钮选中的时候其他选中的按钮将被自动取消。但是缺点是:如果我们想要获取当前被选中的按钮是哪一个,不太方便判断。一个简单而粗暴的方法是,循环遍历每个单选按钮的状态进行检查。显然这样的方法太笨拙。另外的一个方法是,将这一组单选按钮全部添加到QButtonGroup中去。QButtonGroup是一个容器组件,在Qt Designer中我们找不到这个组件,因为它是不可见的,仅仅是在后台工作的无名英雄。因此,我们需要做的是将所有的单选按钮添加进去,之后通过QButtonGroup的方法可以快速查询按钮状态。具体参见《QT中获取选中的radioButton的两种方法》及《QT中根据ID设置radio按钮》。

如何进行样式定制呢?QRadioButton定制分成两个两个部分:选中按钮和文本。其中我们重点要定制的就是选中按钮,为此我们需要准备一些状态图片。看看Qt帮助手册的内容:

QRadioButton::indicator { # indicator是一个子组件,这里的width和height分别指定按钮的宽和高

width: 13px;

height: 13px;

}

QRadioButton::indicator::unchecked { # 未选中时状态,也即正常状态

image: url(:/images/radiobutton_unchecked.png);

}

QRadioButton::indicator:unchecked:hover { # 未选中时,鼠标悬停时的状态

image: url(:/images/radiobutton_unchecked_hover.png); }

QRadioButton::indicator:unchecked:pressed { #未选中时,按钮下按时的状态

image: url(:/images/radiobutton_unchecked_pressed.png); }

QRadioButton::indicator::checked { # 按钮选中时的状态

image: url(:/images/radiobutton_checked.png);

}

QRadioButton::indicator:checked:hover { # 按钮选中时,鼠标悬停状态 image: url(:/images/radiobutton_checked_hover.png); }

QRadioButton::indicator:checked:pressed { # 按钮选中时,鼠标下按时的状态

image: url(:/images/radiobutton_checked_pressed.png); } 看上面的几条样式语句,我们显然要准备六张图片。利用不同的伪状态设置单选按钮的::indicator子组件。找图片是一件困难的事情,因此我只准备了四张图片。按钮下按时就不设置图片了:

我们自己编写的QSS代码如下:

QRadioButton {

spacing: 5px;

font-size: 14px;

color: rgb(24, 220, 88); # 连同 font-size一齐设置按钮的文本样式

}

QRadioButton::indicator { # 设置为我们图片的大小

width: 15px;

height: 15px

}

QRadioButton::indicator:checked { # 按钮选中的状态

image: url(:/buttonbg/radio_down);

}

QRadioButton::indicator:disabled { # 按钮禁用时的状态

image: url(:/buttonbg/radio_disable);

}

QRadioButton::indicator:unchecked { # 未选中时的状态

image: url(:/buttonbg/radio_normal);

}

QRadioButton::indicator:unchecked:hover { # 未选中时的鼠标悬停状态 image: url(:/buttonbg/radio_hover);

} 最终效果如下:

当然,图片还可以换成方形的。不过传统设计中单选按钮都设计成了原型,这里的图片来自金山卫士。相比于复选框(QCheckBox),单选按钮少了一个状态:indeterminate。通过我们QCheckBox的setTristate()可以将一个复选框设置成indeterminate状态。对于复选框我们编写如下的QSS代码:

QCheckBox {

spacing: 5px; # 在这里我们也可以设置复选的文本样式

}

QCheckBox::indicator {

width: 15px;

height: 15px;

}

QCheckBox::indicator:unchecked {

image: url(:/buttonbg/checkbox_normal);

}

QCheckBox::indicator:unchecked:disabled {

image: url(:/buttonbg/checkbox_disable);

}

QCheckBox::indicator:unchecked:hover {

image: url(:/buttonbg/checkbox_hover);

}

QCheckBox::indicator:checked {

image: url(:/buttonbg/checkbox_down);

}

QCheckBox::indicator:indeterminate {

image: url(:/buttonbg/checkbox_indeterminate);

} 可以看到,基本定制方法和

QRadioButton

一样,只是多了一个indeterminate状态:

其中,Ruby复选框被设置成了禁用,而python复选框则设置为了indeterminate状态。外观上并没有太大的变化。如果要改变复选框的文本样式,也可以和上面QRadioButton一样设置。总的来说,QRadioButton和QCheckBox的定制还是挺简单的,任务量不大,因为其本身也足够简单。

效果对比

最终的效果对比下:

总结

1. 样式定制的重点是::indicator,利用伪状态为::indicator设置好不同状态时的背景图片。

2. 理解QRadioButton和QCheckBox的不同状态。

ui.radioButton->setStyleSheet(

"QRadioButton {spacing: 5px;font-size: 14px;  color: rgb(97, 108, 114);}"
"QRadioButton::indicator{ width: 12px; height: 12px;}"

"QRadioButton::indicator::unchecked {image: url(:/radioButtonUncheck.png);}"
"QRadioButton::indicator::checked {image: url(:/radioButtonCheck.png);}" 
);



http://blog.csdn.net/itjobtxq/article/details/9629881

http://www.tuicool.com/articles/vmYFJ3m

http://www.cnblogs.com/csuftzzk/p/qss_radiobutton_checkbox.html?utm_source=tuicool&utm_medium=referral

http://blog.csdn.net/itjobtxq/article/details/9629881

0 0
原创粉丝点击