python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法


Posted in Python onJune 26, 2019

本文借用HTML的css语法,将样式表应用到窗口部件。这里只是个简单的例子,实际上样式表的语法很丰富。

以下类似于css:

StyleSheet = """
QComboBox { color: darkblue; }
QLineEdit { color: darkgreen; }
QLineEdit[mandatory="true"] { #mandatory="true"时,QLineEdit的样式会变化
 background-color: rgb(255, 255, 127);
 color: darkblue;
}

如果在选择器的前面加上一个句点,比如.QLineEdit,则选择器就会只应用于指定的类,而不会应用于这个类的子类。如果要求选择器仅用于某一特定窗口部件,则可以对该窗口部件调用setObjectName(),然后用该名字作为选择器的一部分。比如,如果有一个按钮,其对象名字是“findButton”,则应用于这个按钮的选择器就应该是QpushButton#findButton。有些窗口部件会有一些子控件。例如QComboBox会有一个箭头子控件,用户通过点击这个箭头来看到下拉列表。子控件可以指定为选择器的一部分?例如,QComboBox::drop-down。伪状态可以用一个冒号指定?例如,QCheckBox::checked.

#!/usr/bin/env python3

import sys
from PyQt5.QtWidgets import (QApplication, QComboBox, QDialog,
  QDialogButtonBox, QGridLayout, QLabel, QLineEdit, QVBoxLayout)


class ContactDlg(QDialog):

 StyleSheet = """
QComboBox { color: darkblue; }
QLineEdit { color: darkgreen; }
QLineEdit[mandatory="true"] {
 background-color: rgb(255, 255, 127);
 color: darkblue;
}
"""

 def __init__(self, parent=None):
  super(ContactDlg, self).__init__(parent)

  forenameLabel = QLabel("&Forename:")
  self.forenameEdit = QLineEdit()
  forenameLabel.setBuddy(self.forenameEdit)
  surnameLabel = QLabel("&Surname:")
  self.surnameEdit = QLineEdit()
  surnameLabel.setBuddy(self.surnameEdit)
  categoryLabel = QLabel("&Category:")
  self.categoryComboBox = QComboBox()
  categoryLabel.setBuddy(self.categoryComboBox)
  self.categoryComboBox.addItems(["Business", "Domestic",
          "Personal"])
  companyLabel = QLabel("C&ompany:")
  self.companyEdit = QLineEdit()
  companyLabel.setBuddy(self.companyEdit)
  addressLabel = QLabel("A&ddress:")
  self.addressEdit = QLineEdit()
  addressLabel.setBuddy(self.addressEdit)
  phoneLabel = QLabel("&Phone:")
  self.phoneEdit = QLineEdit()
  phoneLabel.setBuddy(self.phoneEdit)
  mobileLabel = QLabel("&Mobile:")
  self.mobileEdit = QLineEdit()
  mobileLabel.setBuddy(self.mobileEdit)
  faxLabel = QLabel("Fa&x:")
  self.faxEdit = QLineEdit()
  faxLabel.setBuddy(self.faxEdit)
  emailLabel = QLabel("&Email:")
  self.emailEdit = QLineEdit()
  emailLabel.setBuddy(self.emailEdit)
  self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok|
           QDialogButtonBox.Cancel)
  addButton = self.buttonBox.button(QDialogButtonBox.Ok)
  addButton.setText("&Add")
  addButton.setEnabled(False)

  grid = QGridLayout()
  grid.addWidget(forenameLabel, 0, 0)
  grid.addWidget(self.forenameEdit, 0, 1)
  grid.addWidget(surnameLabel, 0, 2)
  grid.addWidget(self.surnameEdit, 0, 3)
  grid.addWidget(categoryLabel, 1, 0)
  grid.addWidget(self.categoryComboBox, 1, 1)
  grid.addWidget(companyLabel, 1, 2)
  grid.addWidget(self.companyEdit, 1, 3)
  grid.addWidget(addressLabel, 2, 0)
  grid.addWidget(self.addressEdit, 2, 1, 1, 3)
  grid.addWidget(phoneLabel, 3, 0)
  grid.addWidget(self.phoneEdit, 3, 1)
  grid.addWidget(mobileLabel, 3, 2)
  grid.addWidget(self.mobileEdit, 3, 3)
  grid.addWidget(faxLabel, 4, 0)
  grid.addWidget(self.faxEdit, 4, 1)
  grid.addWidget(emailLabel, 4, 2)
  grid.addWidget(self.emailEdit, 4, 3)
  layout = QVBoxLayout()
  layout.addLayout(grid)
  layout.addWidget(self.buttonBox)
  self.setLayout(layout)

  self.lineedits = (self.forenameEdit, self.surnameEdit,
    self.companyEdit, self.phoneEdit, self.emailEdit)
  for lineEdit in self.lineedits:
   lineEdit.setProperty("mandatory", True)
   lineEdit.textEdited.connect(self.updateUi)
  self.categoryComboBox.activated.connect(self.updateUi)

  self.buttonBox.accepted.connect(self.accept)
  self.buttonBox.rejected.connect(self.reject)
  self.setStyleSheet(ContactDlg.StyleSheet)
  self.setWindowTitle("Add Contact")


 def updateUi(self):
  mandatory = bool(self.companyEdit.property("mandatory"))
  if self.categoryComboBox.currentText() == "Business":
   if not mandatory:
    self.companyEdit.setProperty("mandatory", True)
  elif mandatory:
   self.companyEdit.setProperty("mandatory", False)
  if (mandatory !=
   bool(self.companyEdit.property("mandatory"))):
   self.setStyleSheet(ContactDlg.StyleSheet)

  enable = True
  for lineEdit in self.lineedits:
   if (bool(lineEdit.property("mandatory")) and
    not lineEdit.text()):
    enable = False
    break
  self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(enable)


if __name__ == "__main__":
 app = QApplication(sys.argv)
 form = ContactDlg()
 form.show()
 app.exec_()

运行结果:

python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法

以上这篇python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用PyV8执行javascript代码示例分享
Dec 04 Python
python通过scapy获取局域网所有主机mac地址示例
May 04 Python
浅析Python中else语句块的使用技巧
Jun 16 Python
python 读写txt文件 json文件的实现方法
Oct 22 Python
python 判断是否为正小数和正整数的实例
Jul 23 Python
对numpy中二进制格式的数据存储与读取方法详解
Nov 01 Python
python仿evething的文件搜索器实例代码
May 13 Python
python字符串替换re.sub()方法解析
Sep 18 Python
python matplotlib 画dataframe的时间序列图实例
Nov 20 Python
python实现批量处理将图片粘贴到另一张图片上并保存
Dec 12 Python
PyTorch学习:动态图和静态图的例子
Jan 06 Python
pycharm 中mark directory as exclude的用法详解
Feb 14 Python
ipython和python区别详解
Jun 26 #Python
使用Python计算玩彩票赢钱概率
Jun 26 #Python
java中的控制结构(if,循环)详解
Jun 26 #Python
PyQt5实现QLineEdit添加clicked信号的方法
Jun 25 #Python
pyqt5 键盘监听按下enter 就登陆的实例
Jun 25 #Python
PyQt5响应回车事件的方法
Jun 25 #Python
PyQt5 QTableView设置某一列不可编辑的方法
Jun 25 #Python
You might like
用PHP函数解决SQL injection
2006/10/09 PHP
如何从一个php文件向另一个地址post数据,不用表单和隐藏的变量的
2007/03/06 PHP
PHP垃圾回收机制简单说明
2010/07/22 PHP
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
PHP实现的数据对象映射模式详解
2019/03/20 PHP
用Javascript实现锚点(Anchor)间平滑跳转
2009/09/08 Javascript
Node.js中创建和管理外部进程详解
2014/08/16 Javascript
jQuery中trigger()与bind()用法分析
2015/12/18 Javascript
Javascript 5种方法实现过滤删除前后所有空格
2016/06/22 Javascript
ionic 3.0+ 项目搭建运行环境的教程
2017/08/09 Javascript
详解jquery插件jquery.viewport.js学习使用方法
2017/09/08 jQuery
Vue.js搭建移动端购物车界面
2020/06/28 Javascript
javascrit中undefined和null的区别详解
2019/04/07 Javascript
小程序如何在不同设备上自适应生成海报的实现方法
2019/08/20 Javascript
vue-iview动态新增和删除的方法
2020/06/17 Javascript
简单分析Python中用fork()函数生成的子进程
2015/05/04 Python
Python中splitlines()方法的使用简介
2015/05/20 Python
Python中的推导式使用详解
2015/06/03 Python
Python实现打印螺旋矩阵功能的方法
2017/11/21 Python
基于并发服务器几种实现方法(总结)
2017/12/29 Python
好的Python培训机构应该具备哪些条件
2018/05/23 Python
Python日期时间对象转换为字符串的实例
2018/06/22 Python
python使用tcp实现局域网内文件传输
2020/03/20 Python
python 堆和优先队列的使用详解
2019/03/05 Python
python tkinter控件布局项目实例
2019/11/04 Python
解决Python3下map函数的显示问题
2019/12/04 Python
python实现输入三角形边长自动作图求面积案例
2020/04/12 Python
pytorch判断是否cuda 判断变量类型方式
2020/06/23 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
Sam’s Club山姆会员商店:沃尔玛旗下高端会员制商店
2017/01/16 全球购物
办理暂住证介绍信
2014/01/11 职场文书
创业计划书撰写原则
2014/01/25 职场文书
小学三八妇女节活动方案
2014/03/16 职场文书
2016年高校自主招生自荐信范文
2015/03/24 职场文书
观后感开头
2015/06/19 职场文书