一、在QTDesigner中的QSS的基本使用
使用时最好在空白处点击改变样式表进行全局设置,这样便于管理
#表示各个类的内部细分组件:
*{
background-color: rgb(255, 255, 255);
}
QFrame#frame{
border-image: url(:/picture/Logo/shanChuan.jpg);
border-radius:30px;
}
#frame_2{
background-color: rgba(150, 150, 150, 100);
border-radius:30px;
}
#frame_3{border-image:url(:/picture/src/cancel.png);
}
QLabel#label{
background-color: rgba(80, 80, 80, 160);
border-radius:30px;
}
QLabel#label_2{
background-color: transparent;/*完全透明*/
font: 25pt "汉仪书魂体简";
color: rgba(255, 255, 255, 190);
}
#label_3{
background-color: transparent;/*完全透明*/
font: 8pt "黑体";
text-decoration: underline;
color: rgba(255, 255, 255, 190);
}
QLineEdit{
background-color: transparent;/*完全透明*/
/*border-radius:30px;*/
/*background-color: rgba(176, 176, 176, 150);*/
border: none;
border-bottom:1px solid rgba(255, 255, 255,180);
font: 12pt "Segoe UI";
font: 12pt "楷体";
color: rgb(255, 255, 255);
}
QPushButton{
background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(68, 66, 49, 255), stop:1 rgba(255, 255, 255, 0));
border-radius:5px;
font: 16pt "楷体";
}
QPushButton:hover{ /*hover表示鼠标移动时*/
background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(68, 66, 49, 255), stop:1 rgba(255, 255, 255, 100));
border-radius:5px;
font: 16pt "楷体";
}
QPushButton:pressed{ /*鼠标按下*/
background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(68, 66, 49, 255), stop:1 rgba(255, 255, 255, 100));
border-radius:5px;
font: 16pt "楷体";
paddinf-top:5px;
padding-right:5px;
}
QPushButton#pushButton_2{
border-image: url(:/picture/src/cancel.png);
border-radius:30px;
}
效果
二、读取带qrc的ui
1】在终端下载pyside6
功能:可以使用pyside6将XX.qrc资源文件转换成XX.py
1> win + R 处输入 cmd
2> pip install PySide6 -i https://pypi.tuna.tsinghua.edu.cn/simple
2】 项目引入资源
1> cmd 到当前的项目目录
pyside6-uic.exe test.ui -o test.py #将ui界面文件转化成py文件
pyside6-rcc res.qrc -o res_rc.py # 将.qrc文件转化成py文件
方式1:
2> 在ui界面对应的py文件中 导入资源文件后 输入以下代码 直接运行
方式二:
三、信号与槽函数
1、系统信号与槽函数
信号发送的原理实际上就是信号触发后发送出一个参数,槽函数去接收这个参数并根据参数运行函数。
"""
槽函数的定义
槽函数(slot function)是信号 - 槽机制中的一个重要概念,主要用在图形用户界面(GUI)开发框架(如Qt)中。信号 - 槽机制是一种对象之间的通信机制。当某个事件(如用户点击按钮)发生时,
会发出一个信号,而槽函数就是用来响应这个信号的函数。例如,在一个简单的登录界面中,当用户点击“登录”按钮时,
按钮会发出一个信号,槽函数可以是验证用户名和密码是否正确的函数。一旦信号被触发,槽函数就会被调用,从而实现相应的功能。
为什么叫槽函数
这个名称来源于信号 - 槽机制的英文“signal - slot mechanism”。其中“slot”一词有“槽”的意思。从形象的角度理解,信号就像是一个要插入某个地方的“信号棒”,
而槽函数就像是一个可以容纳这个信号的“槽”。信号和槽函数之间通过连接(connect)操作建立关联,信号发出后,就会“落入”对应的槽函数中,从而触发槽函数的执行。
这种命名方式形象地描述了信号和槽函数之间的关系,就像物品和其存放位置的关系一样。
"""
import sys
from PyQt6 import uic
from PyQt6.QtTextToSpeech import QTextToSpeech
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton
num = 3
class MyWidget(QWidget):
def __init__(self):
super().__init__()
# 通过uic 将ui界面加载到程序中来
# uic.loadUi("./Form.ui") # 不能显示完全的界面
ui = uic.loadUi("./signalAndSlots.ui", self)
self.btn1: QPushButton = ui.btn1
self.btn2: QPushButton = ui.btn2 # 引用绑定btn2
self.btn3: QPushButton = ui.btn3 # 引用绑定btn3
self.btn4: QPushButton = ui.btn4 # 引用绑定btn4
"""1、self.btn2.clicked信号连接(connect)槽函数self.btn2_slot"""
# 点击btn1时btn2变色
self.btn2.clicked.connect(self.btn2_slot) # 当触发点击时间时发送信号至槽函数,槽函数自动执行
self.btn1.clicked.connect(self.btn1_slot)
self.btn3.clicked.connect(self.btn3_slot)
# 点击按钮4实现语音播报【QTextToSpeech】
# 一个信号可以连接多个槽函数,反之亦然
self.btn4.clicked.connect(self.btn4_slot)
self.btn4.clicked.connect(self.btn3_slot)
self.speecher = QTextToSpeech()
"""2、槽函数的编写"""
def btn1_slot(self):
global num
if num % 3 == 0:
self.btn3.setStyleSheet("background-color:red")
elif num % 3 == 1:
self.btn3.setStyleSheet("background-color:green")
else:
self.btn3.setStyleSheet("background-color:blue")
def btn2_slot(self):
self.btn1.setStyleSheet("background-color: rgb(255, 255, 0)")
self.btn1.setEnabled(False)
self.btn1.resize(300, 300)
self.btn1.move(100, 100)
def btn3_slot(self):
self.btn2.resize(self.btn2.width() + 3, self.btn2.height() + 3)
def btn4_slot(self):
global num
if num % 3 == 1:
self.speecher.say(self.btn1.text())
elif num % 3 == 2: # %左边数<右边时结果=左边数
self.speecher.say(self.btn2.text())
elif num % 3 == 0:
self.speecher.say(self.btn3.text())
if __name__ == '__main__':
app = QApplication(sys.argv)
myWidget = MyWidget()
myWidget.show()
sys.exit(app.exec())
2、自定义信号和槽函数、
在需要时槽函数不必在类内,若存在多个窗口,可以写在class外共各个窗口全局使用,窗口只要在主程序中实例化了,槽函数便可直接使用。
"""
1】一个信号可以连接多个槽函数
2】一个槽函数可以连接多个信号
3】信号的形参的类型和槽函数的参数类型 必须保持一致
4】信号的形参个数 >= 槽函数的参数个数
"""
from PySide6.QtCore import Signal, QObject
"信号"
class Person(QObject):
# 使用信号类Signal实例化自定义的信号对象
speak = Signal(str)
"槽"
def speak_world(world):
print(world)
if __name__ == '__main__':
# 实例化person
person = Person()
person.speak.connect(speak_world)
# 自定义的信号需要手动触发
person.speak.emit("Hello World!")
思维导图:
四、login登录界面的优化
"""
引入信号和槽函数
pyside6-uic.exe test.ui -o test.py #将ui界面文件转化成py文件
pyside6-rcc res.qrc -o res_rc.py # 将.qrc文件转化成py文件
"""
import sys
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QWidget, QApplication, QPushButton,QMainWindow,QToolBar,QDockWidget,QMessageBox
from qss_login_v3_ui import Ui_Form
from ui_2 import Ui_MainWindow
from PyQt6 import uic
# pyside6-uic.exe ui_2.ui -o ui_2.py
class myWindow(QWidget, Ui_Form): # 多重继承,同时存在QWidget和Ui_Form的功能,这种ui读取方法不可与之前的混用
def __init__(self):
super().__init__()
# 加载ui文件
ui = self.setupUi(self) # 用 Ui_Form 类中的 setupUi() 方法,把设计好的 UI 元素(按钮xi、输入框、布局等)挂载到 myWindow 这个 QWidget 实例上。
self.pushButton_2.clicked.connect(
self.pushButton_2_slot) # 不需要self.pushButton_2:QPushButton = self.pushButton_2,用setupUi已经直接加载到self了,与uic.load不同
self.pushButton.clicked.connect(pushButton_slot)
def pushButton_2_slot(self):
self.close()
class window_2(QMainWindow, Ui_MainWindow): # setupUi读取而不是uic.load,因为PySide6和PyQt6存在区别
# 以下不再频繁采用designer,用designer修改需要频繁用命令生成py文件,只适合初步设计
def __init__(self):
super().__init__()
# 加载ui文件
ui = self.setupUi(self) # 用 Ui_Form 类中的 setupUi() 方法,把设计好的 UI 元素(按钮、输入框、布局等)挂载到 myWindow 这个 QWidget 实例上。
# 菜单栏
# menuBar = self.menuBar()
# self.setMenuBar(menu)
#工具栏
toolBar = QToolBar(self) # 表明从属于self
self.addToolBar(Qt.ToolBarArea.LeftToolBarArea,toolBar) # 表示在self中显示
self.menu_btn1 = QPushButton('消息')
self.menu_btn2 = QPushButton('联系人')
toolBar.addWidget(self.menu_btn1)
toolBar.addWidget(self.menu_btn2)
# 状态栏
# 浮动窗口
docker = QDockWidget(self)
self.addDockWidget(Qt.DockWidgetArea.LeftDockWidgetArea,docker)
docker.addAction("aaa")
# 设置 QDockWidget 的特性,禁止浮动和移动
docker.setFeatures(QDockWidget.DockWidgetClosable) # 只允许关闭,不允许浮动和移动
self.dock_btn1 = QPushButton('aaa建材王总1')
docker.setWidget(self.dock_btn1)
def pushButton_slot(): # 将槽函数设为全局可用而不是某一类下
if window.lineEdit.text() == "admin" and window.lineEdit_2.text() == "123456":
# python基础:window.lineEdit.text()钟text后面要加一个括号是因为这是一个函数,若window.lineEdit.text是一个对象就不需要括号
print("匹配成功")
window.close()
window_2.show()
else:
print("匹配失败")
window.lineEdit.setText("")
window.lineEdit_2.setText("")
QMessageBox.information(window, "提示", "帐号或密码错误") # window表示父窗口
if __name__ == '__main__':
app = QApplication(sys.argv)
window = myWindow()
# 设置纯净窗口(无边框)
window.setWindowFlag(Qt.WindowType.FramelessWindowHint)
# 去掉窗口多余的空白部分-----------------------------------------------------------------------------------------------
window.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
window.show()
window_2 = window_2()
sys.exit(app.exec())
输入错误:
输入正确:
点击登录后: