pyqt5讲解13:图形与特效

一.窗口的风格

可以为每个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里的内容,忘记啦。

在这里插入图片描述

电气工程的计算机萌新,写博文不容易,如果你觉得本文对你有用,请点个赞支持下,谢谢。

猜你喜欢

转载自blog.csdn.net/kobeyu652453/article/details/108362771