QObject的所有有核心方法、属性的详细解说

QObject所有核心方法、属性 的详细解说(基于 PySide6/PyQt6 的 Python 实现),按功能分类说明:


一、父子对象管理

方法

  1. setParent(parent: QObject)

    • 功能:设置对象的父对象,父对象被销毁时会自动销毁子对象。
    • 示例
      parent = QObject()
      child = QObject()
      child.setParent(parent)  # 设置父子关系
      
  2. parent() -> QObject

    • 功能:返回当前对象的父对象。
    • 示例
      print(child.parent() is parent)  # 输出 True
      
  3. children() -> List[QObject]

    • 功能:返回所有直接子对象的列表。
    • 示例
      for child in parent.children():
          print(child.objectName())
      
  4. findChild(type, objectName: str = ..., options: Qt.FindChildOption = ...) -> QObject

    • 功能:按类型和名称查找子对象。
    • 示例
      button = parent.findChild(QPushButton, "submitButton")
      
  5. findChildren(...)

    • 功能:查找所有符合条件的子对象(支持正则表达式)。
    • 示例
      buttons = parent.findChildren(QPushButton, Qt.FindDirectChildrenOnly)
      

二、信号与槽机制

方法

  1. connect(signal, slot, type=Qt.AutoConnection)

    • 功能:连接信号与槽。
    • 示例
      button.clicked.connect(self.handle_click)
      
  2. disconnect()

    • 功能:断开所有信号连接。
    • 示例
      button.clicked.disconnect()
      
  3. blockSignals(block: bool) -> bool

    • 功能:临时阻塞信号发射。
    • 示例
      obj.blockSignals(True)  # 阻止信号
      obj.my_signal.emit()    # 不会触发槽函数
      obj.blockSignals(False)
      
  4. signalsBlocked() -> bool

    • 功能:检查信号是否被阻塞。

三、动态属性

方法

  1. setProperty(name: str, value: Any) -> bool

    • 功能:设置动态属性(可存储任意类型数据)。
    • 示例
      obj.setProperty("priority", 100)
      
  2. property(name: str) -> Any

    • 功能:获取动态属性的值。
    • 示例
      print(obj.property("priority"))  # 输出 100
      
  3. dynamicPropertyNames() -> List[QByteArray]

    • 功能:返回所有动态属性名称的列表。

四、对象标识与元信息

方法

  1. setObjectName(name: str)

    • 功能:设置对象的唯一标识符(常用于样式表或查找)。
    • 示例
      label.setObjectName("titleLabel")
      
  2. objectName() -> str

    • 功能:返回对象的名称。

属性

  • objectName: str
    • 直接访问对象名称(等同于 objectName()setObjectName())。

五、定时器管理

方法

  1. startTimer(interval: int, timerType: Qt.TimerType = Qt.CoarseTimer) -> int

    • 功能:启动定时器,返回定时器 ID。
    • 示例
      self.timer_id = self.startTimer(1000)  # 1秒触发一次
      
  2. killTimer(id: int)

    • 功能:停止指定 ID 的定时器。
  3. timerEvent(event: QTimerEvent)

    • 功能:重写此方法处理定时器事件。
    • 示例
      def timerEvent(self, event):
          if event.timerId() == self.timer_id:
              print("Timer triggered!")
      

六、事件处理

方法

  1. event(event: QEvent) -> bool

    • 功能:主事件处理器,可重写以处理所有事件。
  2. installEventFilter(filterObj: QObject)

    • 功能:安装事件过滤器对象。
    • 示例
      filter = EventFilter()
      obj.installEventFilter(filter)
      
  3. removeEventFilter(filterObj: QObject)

    • 功能:移除事件过滤器。

七、线程支持

方法

  1. moveToThread(thread: QThread)

    • 功能:将对象移动到指定线程(需在对象无父对象时调用)。
    • 示例
      worker = Worker()
      thread = QThread()
      worker.moveToThread(thread)
      thread.start()
      
  2. thread() -> QThread

    • 功能:返回对象所属的线程。

八、其他关键方法

方法

  1. inherits(className: str) -> bool

    • 功能:检查对象是否继承某个类。
    • 示例
      print(widget.inherits("QWidget"))  # 输出 True
      
  2. deleteLater()

    • 功能:安全延迟删除对象(由事件循环处理)。
  3. dumpObjectTree()

    • 功能:调试时打印对象树结构。
  4. dumpObjectInfo()

    • 功能:打印对象的信号/槽连接信息。

九、核心属性(PySide6/PyQt6 中通过方法访问)

  • objectName:对象的唯一标识符。
  • parent:父对象(通过 parent() 方法访问)。
  • children:子对象列表(通过 children() 方法访问)。

十、完整代码示例

示例:综合使用父子对象、信号、动态属性

from PySide6.QtCore import QObject, Signal, Slot, QTimer

class Sensor(QObject):
    data_updated = Signal(float)

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setObjectName("TemperatureSensor")
        self._value = 0.0

    def start_monitoring(self):
        self.timer = QTimer(self)  # 父对象为 self,自动管理内存
        self.timer.timeout.connect(self.update_value)
        self.timer.start(1000)

    def update_value(self):
        self._value += 1.5
        self.data_updated.emit(self._value)

class Monitor(QObject):
    @Slot(float)
    def log_value(self, value):
        print(f"Current value: {value}")

# 使用示例
sensor = Sensor()
monitor = Monitor()

sensor.data_updated.connect(monitor.log_value)
sensor.start_monitoring()

# 动态属性
sensor.setProperty("unit", "°C")
print(sensor.property("unit"))  # 输出 °C

关键总结

  • 父子对象树:确保内存自动管理,避免内存泄漏。
  • 信号与槽:实现跨对象通信,松耦合设计。
  • 动态属性:灵活扩展对象属性,支持元编程。
  • 事件系统:通过重写 event() 或使用事件过滤器自定义行为。
  • 线程安全:使用 moveToThread() 实现多线程编程。

在 Python 中需注意:PySide6/PyQt6 的对象生命周期受 Python 垃圾回收和 Qt 父子关系的双重管理,建议优先使用 Qt 的父子关系进行内存管理。

posted @ 2025-04-27 08:27  天堂面包  阅读(98)  评论(0)    收藏  举报