【问题标题】:How to obtain the set of all signals for a given widget?如何获取给定小部件的所有信号集?
【发布时间】:2015-03-31 06:51:10
【问题描述】:

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

例如(withPyQt):

allSignalsList = thisWidget.getSignals()

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

【问题讨论】:

    标签: qt pyqt pyside pyqt5 qt-signals


    【解决方案1】:

    没有用于列出信号的内置方法,但是普通的 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

    【讨论】:

    • 所以对于那些在'contents'侧边栏不显示信号的类,你必须查看它继承的类。我知道了。还有,很好的、有指导意义的代码 sn-p。
    • 有没有一种安全的方法来检测和跳过来自 QObject 基的所有信号?
    • @Silicomancer 我更新了代码示例,以便按类对其进行分解。希望您能看到如何将其适应您自己的用例。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 2017-12-11
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      相关资源
      最近更新 更多