代码之家  ›  专栏  ›  技术社区  ›  Piotr Byzia

如何截获Qt中给定事件发出的所有信号?

  •  9
  • Piotr Byzia  · 技术社区  · 16 年前

    为什么我需要它?我正在使用一些基于 QWidget ,当我解除附加时,它不会展开 QDockWidget

    4 回复  |  直到 8 年前
        1
  •  10
  •   rohanpm    16 年前

    这在任何公共API中都是不可能的。

    -vs 打印出每个发出的信号。

        2
  •  7
  •   feedc0de RushPL    9 年前

    QSignalSpy 班级。

        3
  •  2
  •   mtvec    16 年前

    • 列出使用QMetaObject::method和QMetaMethod::methodType的类的所有信号;
    • 检查谁使用QObject::sender调用了插槽。

    但这件事之后我就被困住了。我不认为,除了发送方之外,还可以获得关于如何调用slot的任何信息。

        4
  •  2
  •   andrejr    6 年前

    如果使用PyQT5而不是Qt5,那么可以使用Python的内省功能查找任何类的所有信号,并将它们连接到(虚拟对象的)虚拟槽。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    from typing import Iterable
    
    from PyQt5.QtCore import pyqtBoundSignal
    from PyQt5.QtCore import pyqtSlot
    from PyQt5.QtCore import QObject
    
    
    def list_all_signals(obj: QObject) -> Iterable[pyqtBoundSignal]:
        attr_names = dir(obj)
        attributes = (getattr(obj, attr_name) for attr_name in attr_names)
        connectable = filter(lambda l: hasattr(l, "connect"), attributes)
    
        return connectable
    
    
    class SignalListener(QObject):
        @pyqtSlot()
        def universal_slot(self, *args, **kwargs):
            print("Signal caught" + 30 * "-")
            print("sender:", self.sender())
            meta_method = (
                self.sender().metaObject().method(self.senderSignalIndex())
            )
            print("signal:", meta_method.name())
            print("signal signature:", meta_method.methodSignature())
    
    
    SIGNAL_LISTENER = SignalListener()
    
    
    def spy_on_all_signals(
        obj: QObject, listener: SignalListener = SIGNAL_LISTENER
    ):
        for signal in list_all_signals(obj):
            signal.connect(SIGNAL_LISTENER.universal_slot)
    

    例如,如果您监视随机QLineEdit,如下所示:

    some_line_edit = QLineEdit(self)
    spy_on all_signals(some_line_edit)
    

    Signal caught ------------------------------
    sender: <PyQt5.QtWidgets.QLineEdit object at 0x7f220f7a3370>
    signal: b'cursorPositionChanged'
    signal signature: b'cursorPositionChanged(int,int)'
    Signal caught ------------------------------
    sender: <PyQt5.QtWidgets.QLineEdit object at 0x7f220f7a3370>
    signal: b'selectionChanged'
    signal signature: b'selectionChanged()'
    Signal caught ------------------------------
    sender: <PyQt5.QtWidgets.QLineEdit object at 0x7f220f7a3370>
    signal: b'selectionChanged'
    signal signature: b'selectionChanged()'
    Signal caught ------------------------------
    sender: <PyQt5.QtWidgets.QLineEdit object at 0x7f220f7a3370>
    signal: b'editingFinished'
    signal signature: b'editingFinished()'
    
        5
  •  0
  •   Jure    15 年前

    退房 signal spying . 对QT库和监视信号/插槽有了一些很好的了解。