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循环监控远程端口的方法
Mar 14 Python
Python多线程、异步+多进程爬虫实现代码
Feb 17 Python
利用Django提供的ModelForm增删改数据的方法
Jan 06 Python
Python设计模式之适配器模式原理与用法详解
Jan 15 Python
python根据txt文本批量创建文件夹
Dec 08 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
Aug 24 Python
flask 实现token机制的示例代码
Nov 07 Python
Keras实现将两个模型连接到一起
May 23 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
Jun 04 Python
Django启动时找不到mysqlclient问题解决方案
Nov 11 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
Mar 02 Python
Python基础之操作MySQL数据库
May 06 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文件上传及下载附带显示文件及目录功能
2017/04/27 PHP
thinkPHP分页功能实例详解
2017/05/05 PHP
详解PHP变量传值赋值和引用赋值变量销毁
2019/03/23 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
2019/08/03 PHP
基于jquery库的tab新形式使用
2012/11/16 Javascript
JavaScript中的undefined学习总结
2013/11/30 Javascript
jquery基础教程之deferred对象使用方法
2014/01/22 Javascript
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
2014/05/05 Javascript
Bootstrap页面布局基础知识全面解析
2016/06/13 Javascript
js将滚动条滚动到指定位置的简单实现方法
2016/06/25 Javascript
如何防止INPUT按回车自动提交表单FORM
2016/12/06 Javascript
Angularjs中使用轮播图指令swiper
2017/05/30 Javascript
使用selenium抓取淘宝的商品信息实例
2018/02/06 Javascript
解决v-for中使用v-if或者v-bind:class失效的问题
2018/09/25 Javascript
Python中for循环和while循环的基本使用方法
2015/08/21 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
2017/07/27 Python
Python探索之SocketServer详解
2017/10/28 Python
Python实现SQL注入检测插件实例代码
2019/02/02 Python
python读取并写入mat文件的方法
2019/07/12 Python
python 并发编程 阻塞IO模型原理解析
2019/08/20 Python
Python with语句和过程抽取思想
2019/12/23 Python
Tensorflow累加的实现案例
2020/02/05 Python
在django中使用apscheduler 执行计划任务的实现方法
2020/02/11 Python
python 实现PIL模块在图片画线写字
2020/05/16 Python
浅析python 字典嵌套
2020/09/29 Python
python 实现控制鼠标键盘
2020/11/27 Python
大学活动总结范文
2014/04/29 职场文书
关于运动会的广播稿(10篇)
2014/09/12 职场文书
旷课检讨书范文
2015/01/27 职场文书
医德医风个人总结
2015/02/28 职场文书
初中班干部工作总结
2015/08/10 职场文书
员工工作心得体会
2019/05/07 职场文书
2019大学生实习报告
2019/06/21 职场文书
创业计划书之零食店(进口)
2019/09/24 职场文书
Python中常见的反爬机制及其破解方法总结
2021/06/10 Python
Python编程中内置的NotImplemented类型的用法
2022/03/23 Python