如何获取给定小部件的所有信号集?

How to obtain the set of all signals for a given widget?

我正在查看 Qt 文档。有没有一种快速而肮脏的方法来获取小部件可以发出的所有信号的列表。

例如(使用 PyQt):

allSignalsList = thisWidget.getSignals()

或者,新 Qt5 API 上是否有一个很好的地方可以显示给定 QObject 的所有信号?

诀窍是使用 QObject 的 meta object 遍历 QObject 的方法,然后挑选出具有信号类型的方法。

例如,此代码片段将打印出 QThread 信号的名称:

QThread thread;
QMetaObject metaObject = thread.staticMetaObject;
for (int i = 0; i < metaObject.methodCount(); i++) {
    QMetaMethod method = metaObject.method(i);
    if (method.methodType() == QMetaMethod::Signal) {
        qDebug() << "Signal: " << method.name();
    }
}

将 QMetaMethods 放入 QList 或任何其他数据结构中应该是微不足道的。

没有用于列出信号的内置方法,但正常的 python 对象内省将相当容易地获取信息:

from PyQt5 import QtCore, QtWidgets

def get_signals(source):
    cls = source if isinstance(source, type) else type(source)
    signal = type(QtCore.pyqtSignal())
    for subcls in cls.mro():
        clsname = f'{subcls.__module__}.{subcls.__name__}'
        for key, value in sorted(vars(subcls).items()):
            if isinstance(value, signal):
                print(f'{key} [{clsname}]')

get_signals(QtWidgets.QPushButton)

输出:

clicked [PyQt5.QtWidgets.QAbstractButton]
pressed [PyQt5.QtWidgets.QAbstractButton]
released [PyQt5.QtWidgets.QAbstractButton]
toggled [PyQt5.QtWidgets.QAbstractButton]
customContextMenuRequested [PyQt5.QtWidgets.QWidget]
windowIconChanged [PyQt5.QtWidgets.QWidget]
windowIconTextChanged [PyQt5.QtWidgets.QWidget]
windowTitleChanged [PyQt5.QtWidgets.QWidget]
destroyed [PyQt5.QtCore.QObject]
objectNameChanged [PyQt5.QtCore.QObject]

但是,学习使用 Qt Documentation 可能会更好。如果您转到 Qt class 页面,右上角有一个 Contents 边栏,其中包含主要成员类型的链接。这通常包括一个信号部分,但如果没有,您可以向下钻取继承的 classes 直到找到一个。

例如,QPushButton page doesn't show a signals section, but it inherits QAbstractButton, which does have one