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 相关文章推荐
浅谈flask中的before_request与after_request
Jan 20 Python
python3.5 tkinter实现页面跳转
Jan 30 Python
python requests.post带head和body的实例
Jan 02 Python
python 获取毫秒数,计算调用时长的方法
Feb 20 Python
python导包的几种方法(自定义包的生成以及导入详解)
Jul 15 Python
Django shell调试models输出的SQL语句方法
Aug 29 Python
Python matplotlib生成图片背景透明的示例代码
Aug 30 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
Apr 30 Python
利用python绘制正态分布曲线
Jan 04 Python
Spy++的使用方法及下载教程
Jan 29 Python
学点简单的Django之第一个Django程序的实现
Feb 24 Python
超级详细实用的pycharm常用快捷键
May 12 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编程中八种常见的文件操作方式
2006/11/19 PHP
PHP实现的分页类定义与用法示例
2017/07/05 PHP
PHP命名空间用法实例分析
2019/09/04 PHP
简单JS代码压缩器
2006/10/12 Javascript
jquery div 居中技巧应用介绍
2012/11/24 Javascript
javascript瀑布流布局实现方法详解
2016/02/17 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
2016/05/26 Javascript
JS锚点的设置与使用方法
2016/09/05 Javascript
JS实现title标题栏文字不间断滚动显示效果
2016/09/07 Javascript
分分钟玩转Vue.js组件
2016/10/25 Javascript
javascript实现数据双向绑定的三种方式小结
2017/03/09 Javascript
Angular2利用组件与指令实现图片轮播组件
2017/03/27 Javascript
JavaScript实现的选择排序算法实例分析
2017/04/14 Javascript
js实现各浏览器全屏代码实例
2018/07/03 Javascript
JavaScript防止全局变量污染的方法总结
2018/08/02 Javascript
React Native中Mobx的使用方法详解
2018/12/04 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
JS数组去重的6种方法完整实例
2018/12/08 Javascript
antd form表单数据回显操作
2020/11/02 Javascript
python和shell实现的校验IP地址合法性脚本分享
2014/10/23 Python
Python实现公历(阳历)转农历(阴历)的方法示例
2017/08/22 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
2019/03/27 Python
python与C、C++混编的四种方式(小结)
2019/07/15 Python
tensorflow-gpu安装的常见问题及解决方案
2020/01/20 Python
django 模型中的计算字段实例
2020/05/19 Python
python 通过 pybind11 使用Eigen加速代码的步骤
2020/12/07 Python
西班牙创意礼品和小工具网上商店:Curiosite
2016/07/26 全球购物
BIBLOO波兰:捷克的一家在线服装店
2018/03/09 全球购物
捷克鲜花配送:Florea.cz
2018/10/29 全球购物
十佳教师事迹材料
2014/01/11 职场文书
公务员转正考察材料
2014/02/07 职场文书
一行Python命令实现批量加水印
2022/04/07 Python
Spring Data JPA框架的核心概念和Repository接口
2022/04/28 Java/Android
MySQL索引失效十种场景与优化方案
2023/05/08 MySQL