pyqt-3(QSS、读取带qrc的ui、信号与槽函数)

发布于:2025-07-11 ⋅ 阅读:(16) ⋅ 点赞:(0)

一、在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())

输入错误:

输入正确:

点击登录后:


网站公告

今日签到

点亮在社区的每一天
去签到