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实现HTTP协议下的文件下载方法总结
Apr 20 Python
python机器学习之神经网络(二)
Dec 20 Python
python绘制中国大陆人口热力图
Nov 07 Python
Django CSRF跨站请求伪造防护过程解析
Jul 31 Python
python 字典 setdefault()和get()方法比较详解
Aug 07 Python
python中的逆序遍历实例
Dec 25 Python
使用jupyter notebook直接打开.md格式的文件
Apr 10 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
Apr 30 Python
Python命名空间namespace及作用域原理解析
Jun 05 Python
详解Python IO编程
Jul 24 Python
python对 MySQL 数据库进行增删改查的脚本
Oct 22 Python
python3字符串输出常见面试题总结
Dec 01 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部分常见问题总结
2006/10/09 PHP
PHP 文本文章分页代码 按标记或长度(不涉及数据库)
2012/06/07 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
[对联广告] JS脚本类
2006/08/27 Javascript
myEvent.js javascript跨浏览器事件框架
2011/10/24 Javascript
javascript针对DOM的应用实例(一)
2012/04/15 Javascript
js实现两个值相加alert出来精确到指定位
2013/09/25 Javascript
JS实现可调整倒计时间代码分享
2015/08/18 Javascript
js带缩略图的图片轮播效果代码分享
2015/09/14 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
微信小程序 解决swiper不显示图片的方法
2017/01/04 Javascript
原生js实现焦点轮播图效果
2017/01/12 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
2017/09/01 jQuery
mui框架移动开发初体验详解
2017/10/11 Javascript
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
vue动态绑定class的几种常用方式小结
2019/05/21 Javascript
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
开源一个微信小程序仪表盘组件过程解析
2019/07/30 Javascript
Python使用pygame模块编写俄罗斯方块游戏的代码实例
2015/12/08 Python
Python3.4学习笔记之列表、数组操作示例
2019/03/01 Python
pyinstaller参数介绍以及总结详解
2019/07/12 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
2019/08/09 Python
Python3 中sorted() 函数的用法
2020/03/24 Python
浅析python中的del用法
2020/09/02 Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
2020/09/16 Python
高级护理实习生自荐信
2013/09/28 职场文书
给护士表扬信
2014/01/19 职场文书
幼儿园春季开学寄语
2014/04/03 职场文书
天猫活动策划方案
2014/08/21 职场文书
学习党的群众路线对照检查材料
2014/09/29 职场文书
审计局班子四风对照检查材料思想汇报
2014/10/07 职场文书
整改报告格式
2014/11/06 职场文书
中学生思想品德评语
2014/12/31 职场文书
2016年学习雷锋精神广播稿
2015/12/17 职场文书
大学生安全教育心得体会
2016/01/15 职场文书
MySQL 如何分析查询性能
2021/05/12 MySQL