一.窗口的风格
可以为每个QWidget都设置风格
setStyle(QStyle style)
获取当前平台支持的原有的QStyle样式
QstyleFactory.keys()
对QApplication设置QStyle样式
QApplication.setStyle(QStyleFactory.create(‘WindowsXP’))
风格大全
Windows
WindowsXP
WindowsVista
Fusion
如果其他Widget没有设置QStyle,默认使用QApplication设置的style
算例1
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5 import QtCore
from PyQt5.QtGui import *
class AppWidget( QWidget):
def __init__(self, parent=None):
super(AppWidget, self).__init__(parent)
self.setWindowTitle("界面风格例子")
horizontalLayout = QHBoxLayout()
self.styleLabel = QLabel("Set Style:")
self.styleComboBox = QComboBox()
# 增加 styles 从 QStyleFactory
self.styleComboBox.addItems( QStyleFactory.keys())
# 选择当前界面风格
index = self.styleComboBox.findText(
QApplication.style().objectName(),
QtCore.Qt.MatchFixedString)
# 设置当前界面风格
self.styleComboBox.setCurrentIndex(index)
# 通过comboBox选择界面分割
self.styleComboBox.activated[str].connect(self.handleStyleChanged)
horizontalLayout.addWidget(self.styleLabel)
horizontalLayout.addWidget(self.styleComboBox)
self.setLayout(horizontalLayout)
# 改变界面风格
def handleStyleChanged(self, style):
QApplication.setStyle(style)
if __name__ == "__main__":
app = QApplication(sys.argv)
widgetApp = AppWidget()
widgetApp.show()
sys.exit(app.exec_())
算例2
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton
from PyQt5.QtWidgets import *
class Winform(QWidget):
def __init__(self, parent=None):
super(Winform, self).__init__(parent)
self.setWindowTitle("水平布局管理例子")
# 水平布局按照从左到右的顺序进行添加按钮部件。
hlayout = QHBoxLayout()
hlayout.addWidget(QPushButton(str(1)))
hlayout.addWidget(QPushButton(str(2)))
hlayout.addWidget(QPushButton(str(3)))
hlayout.addWidget(QPushButton(str(4)))
hlayout.addWidget(QPushButton(str(5)))
self.setLayout(hlayout)
if __name__ == "__main__":
app = QApplication(sys.argv)
QApplication.setStyle(QStyleFactory.create('Windows'))
form = Winform()
form.show()
sys.exit(app.exec_())
WindowsXP
二.设置窗口的样式
基本窗口类型
窗口类型 | 描述 |
---|---|
Qt.Widget | 默认窗口,有最小化,最大化,关闭按钮 |
Qt.Window | 普通窗口,有最小化,最大化,关闭按钮 |
Qt.Dialog | 会话框窗口,有问号和关闭按钮 |
Qt.Popup | 弹出窗口,窗口无边框 |
Qt.ToolTip | 提示窗口,窗口无边框,无任务栏 |
Qt.SplashScreen | 闪屏,窗口无边框,无任务栏 |
Qt.SubWindow | 子窗口,窗口无按钮,但有标题 |
自定义顶层窗口外观标志
属性 | 描述 |
---|---|
Qt.MSWindowsFixedSizeDialogHint | 固定窗口,无法调整大小 |
Qt.FramelessWindowHint | 窗口无边框 |
Qt.CustomizeWindowHint | 有边框,无标题栏与按钮,不能移动和拖动 |
Qt.WindowTitleHint | 添加标题栏与关闭按钮 |
Qt.WindowSystemMenuHint | 添加系统目录和关闭按钮 |
Qt.WindowMaximizeButtonHint | 激活最大化按钮与关闭按钮,禁止最小化按钮 |
Qt.WindowMinimizeButtonHint | 激活最小化按钮与关闭按钮,禁止最大化按钮 |
Qt.WindowMinMaxButtonsHint | 激活最大化与最小化按钮和关闭按钮 |
Qt.WindowCloseButtonHint | 添加一个关闭按钮 |
Qt.WindowStaysOnTopHint | 窗口始终处于顶部位置 |
Qt.windowStaysOnButtonHint | 窗口始终处于底部位置 |
算例
# -*- coding: utf-8 -*-
"""
【简介】
设置窗口样式
"""
from PyQt5.QtCore import Qt
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.resize(477, 258)
self.setWindowTitle("设置窗口样式例子")
# 设置窗口样式为窗口无边框化
self.setWindowFlags(Qt.SubWindow)
self.setObjectName("MainWindow")
self.setStyleSheet("#MainWindow{border-image:url(duoren.jpg);}")
if __name__ == "__main__":
app = QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())
三.QSS 的 UI 美化
QSS(Qt Style Sheets)即 Qt 样式表,用于自定义控件外观,QSS 类似于 CSS 但没有 CSS 的功能强大,选择器较少。
1、QSS 的语法规则
QSS 的语法规则与 CSS 类似,都由两部分:选择器和声明构成;选择器指定哪些控件会受影响,声明指定哪些属性应该在控件上进行设置。
声明由属性和属性值构成,其形式:属性:值。
QPushButton {color:red}
算例1
from PyQt5.QtWidgets import *
import sys
class WindowDemo(QWidget):
def __init__(self ):
super().__init__()
btn1 = QPushButton(self )
btn1.setText('按钮1')
btn2 = QPushButton(self )
btn2.setText('按钮2')
vbox=QVBoxLayout()
vbox.addWidget(btn1)
vbox.addWidget(btn2)
self.setLayout(vbox)
self.setWindowTitle("QSS样式")
if __name__ == "__main__":
app = QApplication(sys.argv)
win = WindowDemo()
qssStyle = '''
QPushButton{
background-color: green;
}
'''
win.setStyleSheet( qssStyle )
win.show()
sys.exit(app.exec_())
QSS 选择器有以下几种类型:这些都是前端css里的内容
通配选择器:*, 匹配所有的控件。
类型选择器:类名,匹配所有的该类及其子类的控件,如,QPushButton。
属性选择器:类名[属性=属性值],如,QPushButton[name=“myBtn”],匹配所有 name 属性为 myBtn 的 QPushButton 实例;属性可以是自定义的,不一定非得类本身具有的属性。
类选择器:.类名(注意:前面有一个点号),匹配该类的所有实例,不包括子类。
ID 选择器:#ID标识符,匹配所有 ID标识符 符合的控件,ID 即为 objectName 指定的值。
后代选择器:例如 QDialog QPushButton,匹配所有的 QDialog 容器中包含的 QPushButton,不管是间接还是直接。
子选择器:例如:QDialog > QPushButton,匹配所有 QDialog 容器中包含的 QPushButton,其中要求 QPushButton 的直接父容器为 QDialog。
3、QSS 子控件
算例2
from PyQt5.QtWidgets import *
import sys
class WindowDemo(QWidget):
def __init__(self ):
super().__init__()
btn1 = QPushButton(self )
btn1.setText('按钮1')
btn2 = QPushButton(self )
btn2.setProperty( 'name' , 'myBtn' )
btn2.setText('按钮2')
vbox=QVBoxLayout()
vbox.addWidget(btn1)
vbox.addWidget(btn2)
self.setLayout(vbox)
self.setWindowTitle("QSS样式")
if __name__ == "__main__":
app = QApplication(sys.argv)
win = WindowDemo()
qssStyle = '''
QPushButton[name="myBtn"] {
background-color: red
}
'''
win.setStyleSheet( qssStyle )
win.show()
sys.exit(app.exec_())
还可以通过setStyleSheet 来设置样式
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class Form(QDialog):
def __init__(self, parent=None):
super(Form, self).__init__(parent)
layout = QVBoxLayout()
self.btn1 = QPushButton("Button1")
self.btn1.setStyleSheet("background-color:#ffffff; color:red;")
layout.addWidget(self.btn1)
self.btn2 = QPushButton('image')
layout.addWidget(self.btn2)
self.setLayout(layout)
self.setWindowTitle("Button demo")
if __name__ == '__main__':
app = QApplication(sys.argv)
btnDemo = Form()
btnDemo.show()
sys.exit(app.exec_())
常见样式:
在样式表中,每个部件都被看作是一个由四个同心相似的矩形组成的箱体:
空白(margin)、边框(border)、填充(padding)和内容(content)。
对于一个平面部件——例如一个空白、边框和填充都是0像素的部件——而言,这四个矩形是完全重合的。
空白区域位于边框外,并且总是透明的。
边框为部件提供了四周的框架,其border-style属性可以设置为一些内置的框架风格,如inset、outset、solid和ridge。
填充在边框和内容区域之间提供了空白间隔。
部件的前景色用于绘制上面的文本,可以通过color属性指定。
背景色用于绘制部件的填充矩形,可以通过background-color属性指定。
背景图片使用background-image属性定义,它用于绘制由background-origin指定的矩形区域(空白、边框、填充或内容)。
背景 图片在矩形区域内的对齐和平铺方式可以通过background-position和background-repeat属性指定。
如果指定的背景图片具有alpha通道(即有半透明效果),通过background-color指定的颜色将会透过透明区域。这一功能可以使背景图片在多种环境下重复利用。
该例子中使用的样式表如下所示:
QFrame {
margin: 10px;
border: 2px solid green;
padding: 20px;
background-color: gray;
background-image: url(qt.png);
background-position: top right;
background-origin: content;
background-repeat: none;
}
实际上margin属性可以在上下左右四个方向分别指定我们需要的不同值,例如:QFrame {
margin: 14px 18px 20px 18px;
}
都是前端css里的内容,忘记啦。
电气工程的计算机萌新,写博文不容易,如果你觉得本文对你有用,请点个赞支持下,谢谢。