Signal

destroyed

objectNameChanged

Function

事件处理

  • event(self, event): 事件处理函数,用于处理所有发送到该对象的事件。
  • installEventFilter(self, filterObj): 安装事件过滤器到该对象。
  • removeEventFilter(self, filterObj): 移除之前安装的事件过滤器。
import sys
from PySide6.QtWidgets import QApplication, QPushButton, QMainWindow, QLabel
from PySide6.QtCore import QObject, QEvent
class EventFilter(QObject):
    def eventFilter(self, obj, event):
        # 当按钮被点击时
        if event.type() == QEvent.MouseButtonPress:
            print("Button clicked - event filter")
            return True
        return False
class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # 创建按钮
        self.button = QPushButton("Click me", self)
        self.button.setGeometry(50,50, 100, 50)
        self.button.pressed.connect(lambda:print("!"))
        self.button1 = QPushButton("change mode", self)
        self.button1.setGeometry(200,50, 100, 50)
        self.button1.pressed.connect(self.change)
        # 创建事件过滤器并安装
        self.filter = EventFilter()
        self.button.installEventFilter(self.filter)
        self.installed=True
        self.label = QLabel("Event label", self)
        self.label.setGeometry(100, 150, 200, 30)
    def event(self, event):
        # 处理窗口本身的事件
        if event.type() == QEvent.MouseButtonPress:
            self.label.setText("Window clicked")
            return True
        return super().event(event)
    def change(self,):
        if self.installed:
            self.button.removeEventFilter(self.filter)
            self.installed=False
        else:
            self.button.installEventFilter(self.filter)
            self.installed=True
if __name__=='__main__':
    app = QApplication(sys.argv)
     window = MyWindow()
     window.show()
     sys.exit(app.exec())

对象属性和元对象系统

  • setProperty(self, name, value): 设置对象的属性。
  • property(self, name): 获取对象的属性。
  • objectName(self): 获取对象的名称。
  • setObjectName(self, name): 设置对象的名称。
  • metaObject(self): 获取对象的元对象信息,包含信号、槽、属性等信息。
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel
class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # 设置窗口的名称
        self.setObjectName("MainWindow")
        # 创建一个按钮,并设置一些属性
        self.button = QPushButton("Click me", self)
        self.button.setObjectName("MyButton")
        self.button.setProperty("type", "pushbutton")
        self.button.setGeometry(50, 50, 100, 30)
        # 创建一个标签来显示信息
        self.label = QLabel("", self)
        self.label.setGeometry(50, 100, 300, 50)
        button_type = self.button.property("type")
        button_name = self.button.objectName()
        meta_obj = self.button.metaObject().className()
        self.label.setText(f"Button Name: {button_name}\n"
                           f"Button Type: {button_type}\n"
                           f"Meta Object Class: {meta_obj}")
        # 连接按钮的信号
        self.button.clicked.connect(self.on_button_clicked)
    def on_button_clicked(self):
        # 获取按钮的属性并显示在标签上
        self.label.setObjectName('test')
        self.label.setProperty('name', 'test1')
        print(self.label.property('name'),self.label.objectName())
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec())

对象的父子关系

  • parent(self): 返回对象的父对象。
  • setParent(self, parent): 设置对象的父对象。
  • findChild(self, type, name): 查找满足条件的第一个子对象。
  • findChildren(self, type, name): 查找所有符合条件的子对象。
  • children(self): 返回对象的直接子对象列表。
  • deleteLater(self): 将对象标记为删除,当控制权返回到事件循环时,对象将被删除。
  • inherits(self, className): 检查对象是否继承自指定的类。
  • isWidgetType(self): 判断该对象是否是一个小部件。
  • isWindowType(self): 判断该对象是否是一个窗口。
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton
import pprint

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setObjectName("MainWindow")

        # 创建一个按钮,并设置一些属性
        self.button = QPushButton("Click me")
        self.button.setParent(self)
  
        self.button.objectNameChanged.connect(lambda:print("name chageed"))
        self.button.setObjectName("MyButton")
        self.button.setProperty("type", "pushbutton")
        self.button.setGeometry(50, 50, 100, 30)
        print(
            self.button.isWidgetType(),
            self.button.isWindowType(),
            self.isWindowType(),
        )
        pprint.pprint([self.button.parent(),
              self.findChild(QPushButton),
              self.children()])

        # 连接按钮的信号
        self.button.clicked.connect(self.on_button_clicked)
  
        self.button.destroyed.connect(lambda:print("delete!!"))

    def on_button_clicked(self):
        self.button.deleteLater()



app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec())

信号的连接和阻隔、计时器

blockSignals(self, bool):临时阻止/允许对象发出信号。返回之前的阻止状态 connectNotify(self, QMetaMethod):当一个新的信号连接到对象的槽时调用 timerEvent(self, QTimerEvent):处理计时器事件 startTimer(self, int interval, Qt.TimerType timerType=Qt.PreciseTimer):启动一个计时器 signalsBlocked(self):检查对象是否阻止了信号

import sys
from PySide6.QtCore import QObject, Signal
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton

class CustomObject(QObject):
    customSignal = Signal()

    def __init__(self):
        super().__init__()
        self.timer_id = self.startTimer(2000)  # 启动计时器,每两秒触发一次

    def timerEvent(self, event):
        print("trigger1")
        if event.timerId() == self.timer_id:
            self.customSignal.emit()

    def connectNotify(self, signal):
        print(f"Signal '{signal.name()}' connected")

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.obj = CustomObject()
  
        self.button = QPushButton("Block/dis Signal", self)
        self.button.clicked.connect(self.emit_signal)
        self.button.move(50, 20)
  
        self.button = QPushButton("connect/dis", self)
        self.button.clicked.connect(self.reverse_signal)
        self.button.move(50, 50)
  
        self.obj.customSignal.connect(self.test)
        self.connect=True
  
    def emit_signal(self):
  
        block_status = not self.obj.signalsBlocked()
        self.obj.blockSignals(block_status)
        print(f"Signals blocked: {self.obj.signalsBlocked()}")

    def reverse_signal(self):   
        if self.connect:
            self.obj.customSignal.disconnect(self.test)
        else:
            self.obj.customSignal.connect(self.test)
  
        self.connect = not self.connect
  
    def test(self):
        print("trigger2")

app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec())

Qthread

moveToThread(self, thread: PySide6.QtCore.QThread): 把对象从一个线程移动到另一个线程 thread(self)返回线程的地址

import sys
from PySide6.QtCore import QObject, QThread, Signal, Slot
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QLabel
import time

class Worker(QObject):
    finished = Signal()
    progress = Signal(int)

    def run(self):
        for i in range(0, 5):
            time.sleep(0.5)  # 模拟长时间运行的任务
            self.progress.emit(i + 1)
        self.finished.emit()

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.central_widget = QWidget()
        self.layout = QVBoxLayout(self.central_widget)
        self.setCentralWidget(self.central_widget)

        self.label = QLabel("Task not started", self)
        self.layout.addWidget(self.label)

        self.button = QPushButton("Start Task", self)
        self.button.clicked.connect(self.startTask)
        self.layout.addWidget(self.button)

        self.worker = Worker()
        self.thread = QThread()
        self.worker.moveToThread(self.thread)

        print(self.worker.thread(),self.thread)

        self.worker.finished.connect(self.thread.quit)
        #self.worker.finished.connect(self.worker.deleteLater)
        #self.thread.finished.connect(self.thread.deleteLater)
        self.worker.progress.connect(self.reportProgress)

    def startTask(self):
        self.worker.finished.connect(self.taskFinished)
        self.thread.started.connect(self.worker.run)
        self.thread.start()
        self.button.setEnabled(False)

    @Slot()
    def reportProgress(self, n):
        self.label.setText(f"Progress: {n}")

    @Slot()
    def taskFinished(self):
        self.label.setText("Task finished!")
        self.button.setEnabled(True)

app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec())