Wymień wszystkie sygnały wysyłane przez aplikację qt

0

Pytanie

Odziedziczyłem nieaktualne aplikacji graficznej qt. Jeden z pierwszych, co musisz zrobić, to utworzyć plik dziennika, w którym rejestrowana jest każda interakcja z użytkownikiem, na przykład, naciśnięcie przycisku, edycja QLineEdit i tak dalej. Jest to związane z tym, że użytkownicy, najwyraźniej, nie mogą powiedzieć, jak odtworzyć konkretne błędy, dlatego chcą, gdy błąd jest otwarta, odczytać ten plik dziennika, aby sprawdzić kroki, które użytkownik wykonał, kiedy on ją odkrył.

Widziałem, że można zastąpić notify sposób w QCoreApplication aby uzyskać wszystkie wydarzenia, i to działa, ale to nie jest to, co chcę, tak jak on, wygląda na to, zarządza zdarzeniami systemu operacyjnego, takich jak ostrość, itp., I nie przetwarza promieniowanie sygnałów.

Oczywiście mogę zmienić kod i utworzyć połączenie, na przykład, między textChanged sygnały i lambda, która informuje o tym, ale w tym przypadku trzeba będzie zmienić cały kod che. Czy istnieje sposób, aby osiągnąć ten sam rezultat w inny sposób, nie przepisując większość aplikacji?

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

Najlepsza odpowiedź

1

Możesz wymienić wszystkie wzory w swojej aplikacji za pomocą QApplication::allWidgets().

Następnie możesz wymienić wszystkie sygnały każdego widgetu (z QObject::metaObject()) i podłącz je do rejestratora.

Krótki przykład:

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();
}

Trzeba poprawić kod, jeśli chcesz, aby wyświetlić opcje.

Możesz również filtrować obiekty, aby rejestrować tylko znaczące sygnały (na przykład rejestrować tylko clicked sygnał z przycisków)

2021-11-22 12:57:01

Dziękuję, to bardzo przydatne.
Jepessen

W innych językach

Ta strona jest w innych językach

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