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

时间:2015-02-01 02:46:01

标签: qt pyqt pyside pyqt5 qt-signals

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

例如(withPyQt):

allSignalsList = thisWidget.getSignals()

或者,新的Qt5 API上有一个不错的地方,它显示了给定QObject的所有信号吗?

2 个答案:

答案 0 :(得分:6)

诀窍是使用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或任何其他数据结构中应该是微不足道的。

答案 1 :(得分:6)

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

from PyQt5 import QtCore, QtWidgets

def get_signals(source):
    cls = source if isinstance(source, type) else type(source)
    signal = type(QtCore.pyqtSignal())
    for name in dir(source):
        if isinstance(getattr(cls, name), signal):
            print(name)

get_signals(QtWidgets.QPushButton)

输出:

clicked
customContextMenuRequested
destroyed
objectNameChanged
pressed
released
toggled
windowIconChanged
windowIconTextChanged
windowTitleChanged

但是,学习使用Qt Documentation可能会更好。如果你转到Qt课程的页面,右上角有一个内容侧边栏,其中包含主要成员类型的链接。这通常包括一个信号部分,但如果它没有,你可以深入查看继承的类,直到找到它。

例如,QPushButton页面没有显示信号部分,但它继承了QAbstractButtonhave one