我正在浏览Qt文档。有没有一种快速而肮脏的方法来获取小部件可以发出的所有信号的列表。
例如(使用PyQt):
allSignalsList = thisWidget.getSignals()
或者,新的Qt5 API上是否有一个好地方可以显示给定QObject的所有信号?
没有内置的方法来列出信号,但正常的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文档可能更好。如果您转到Qt类的页面,右上角有一个内容侧边栏,其中包含主要成员类型的链接。这通常包括信号部分,但如果没有,您可以向下钻取继承的类,直到找到一个。
例如,QPushButton 页面不显示信号部分,但它继承了 QAbstractButton,它确实有一个。
诀窍是使用 QObject 的元对象遍历 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或任何其他数据结构应该是微不足道的。