Перечислите все сигналы, излучаемые приложением qt

0

Вопрос

Я унаследовал устаревшее графическое приложение qt. Одно из первых, что мне нужно сделать, это создать файл журнала, в котором регистрируется каждое взаимодействие с пользователем, например, нажатие кнопки, редактирование QLineEdit и так далее. Это связано с тем, что пользователи, по-видимому, не могут сказать, как воспроизвести конкретные ошибки, поэтому они хотят, когда ошибка открыта, прочитать этот файл журнала, чтобы проверить шаги, которые пользователь выполнил, когда он ее обнаружил.

Я видел, что можно переопределить notify способ в QCoreApplication для того, чтобы получить все события, и это работает, но это не то, что я хочу, так как он, похоже, управляет только событиями операционной системы, такими как фокусировка и т. Д., И он не обрабатывает излучение сигналов.

Конечно, я могу изменить код и создать соединение, например, между textChanged сигналы и лямбда, которая сообщает об этом, но в этом случае мне нужно будет изменить весь код 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ý
..................................................................................................................