列出所有发出的信号从夸脱的应用程序

0

的问题

我继承的遗产脱gui应用程序。 一的第一件事我需要做的是创建一个日志文件,其中每一个用户相互作用是记录,如点击按钮,编辑的QLineEdit等。 这是由于这样的事实,用户显然都不能告诉如何再现特定错误,因此他们希望,当一个错误是打开的,阅读本日志文件,以便检查的步骤,用户进行的时候他发现了它。

我已经看到这有可能复盖 notify 方法 QCoreApplication 为了获得所有的事件,它的工作原理,但这不是我想要的,因为它似乎只管理活动的操作系统和重点等等的,它不处理发射的信号。

当然我可以改变的代码和创造之间的连接,例如, textChanged 信号和lambda报告,但在这种情况下,我将需要改变所有che代码。 有没有办法来实现相同的结果在另一种方式,而不改写大多数应用程序的一部分?

events logging qcoreapplication qt
2021-11-22 10:41:12
1

最好的答案

1

你可以列出所有部件在应用程序通过使用 QApplication::allWidgets().

然后,你可以列出所有信号的每个部件(用 QObject::metaObject()),并将它们连接到一个 记录仪.

一个简单的例子:

class Spy: public QObject {
    Q_OBJECT
public:
    Spy();
public slots:
    void log();
};

void Spy::log()
{
    auto i = senderSignalIndex(); // The signal that fired this slot
    auto signal = sender()->metaObject()->method(i);
    qDebug() << sender() << signal.methodSignature();
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    Spy* spy = new Spy();

    QMetaMethod log = spy->metaObject()->method(spy->metaObject()->indexOfSlot("log()")); // in order to use the right QObject::connect signature

    for (auto widget: a.allWidgets())
    {
        auto metaObject = widget->metaObject();
        for (int i = 0; i != metaObject->methodCount(); ++i)
        {
            auto method = metaObject->method(i);
            if (method.methodType() != QMetaMethod::Signal) // We want to connect all the signals. We don't care about the other methods
                continue;

            widget->connect(widget, method, spy, log);
        }
    }
    return a.exec();
}

你就会有改善的代码如果你想要显示的参数。

你也可以过滤器的对象只记录重要的信号,(前记录的只有 clicked 信号从按钮)

2021-11-22 12:57:01

谢谢,这是非常有用的。
Jepessen

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................