【发布时间】:2015-03-31 06:51:10
【问题描述】:
我正在浏览 Qt 文档。有没有一种快速而肮脏的方法来获取一个小部件可以发出的所有信号的列表。
例如(withPyQt):
allSignalsList = thisWidget.getSignals()
或者,在新的 Qt5 API 上有一个不错的地方可以显示给定 QObject 的所有信号吗?
【问题讨论】:
标签: qt pyqt pyside pyqt5 qt-signals
我正在浏览 Qt 文档。有没有一种快速而肮脏的方法来获取一个小部件可以发出的所有信号的列表。
例如(withPyQt):
allSignalsList = thisWidget.getSignals()
或者,在新的 Qt5 API 上有一个不错的地方可以显示给定 QObject 的所有信号吗?
【问题讨论】:
标签: qt pyqt pyside pyqt5 qt-signals
没有用于列出信号的内置方法,但是普通的 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 类的页面,右上角有一个 Contents 侧边栏,其中包含主要成员类型的链接。这通常包括信号部分,但如果没有,您可以向下钻取继承的类,直到找到一个。
例如,QPushButton 页面没有显示信号部分,但它继承了 QAbstractButton,它会显示 have one。
【讨论】:
诀窍是使用 QObject 的 meta object 遍历 QObject 的方法,然后挑选出具有信号类型的方法。
例如,这段代码 sn -p 将打印出 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 或任何其他数据结构中应该是微不足道的。
【讨论】: