pyqt-3(QSS、读取带qrc的ui、信号与槽函数)
一、在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 sysfrom PyQt6 import uic
from PyQt6.QtTextToSpeech import QTextToSpeech
from PyQt6.QtWidgets import QApplication, QWidget, QPushButtonnum = 3class MyWidget(QWidget):def __init__(self):super().__init__()# 通过uic 将ui界面加载到程序中来# uic.loadUi("./Form.ui") # 不能显示完全的界面ui = uic.loadUi("./signalAndSlots.ui", self)self.btn1: QPushButton = ui.btn1self.btn2: QPushButton = ui.btn2 # 引用绑定btn2self.btn3: QPushButton = ui.btn3 # 引用绑定btn3self.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 numif 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 numif 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__':# 实例化personperson = 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 sysfrom 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_MainWindowfrom 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) # 表明从属于selfself.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())
输入错误:
输入正确:
点击登录后: