Lista toate semnalele emise de qt cerere

0

Problema

Am moștenit o moștenire qt gui application. Unul dintre primul lucru pe care trebuie să faceți este de a crea un fișier jurnal în care fiecare interacțiune cu utilizatorul este conectat, cum ar fi clic pe un buton, editare de o QLineEdit și așa mai departe. Aceasta datorită faptului că utilizatorii se pare că nu sunt în măsură să spun cum de a reproduce bug-uri specifice, astfel încât acestea doresc, atunci când un bug este deschis, pentru a citi acest fișier jurnal pentru a verifica pașii pe care utilizatorul efectuează atunci când a găsit-o.

Am văzut că este posibil să suprascrie notify metoda în QCoreApplication în scopul de a obține toate evenimentele, și funcționează, dar nu e ceea ce vreau, deoarece pare să se administreze numai evenimente ale sistemului de operare, cum ar fi concentrarea etc, si nu se ocupa de emițătoare de semnale.

Desigur că pot schimba codul și de a crea o conexiune între, de exemplu, un textChanged semnale și o lambda care raportează, dar în acest caz, eu va trebui să modificați toate che cod. Există o modalitate de a obține același rezultat într-un alt mod, fără rescrierea cea mai mare parte a cererii?

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

Cel mai bun răspuns

1

Puteți lista toate widget-uri în cererea dumneavoastră, prin utilizarea QApplication::allWidgets().

Apoi, ai putea lista toate semnalele de la fiecare widget (cu QObject::metaObject()) și să le conecteze la un logger.

Un exemplu rapid:

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

Va trebui pentru a îmbunătăți cod dacă doriți să afișați parametrii.

Puteți filtra, de asemenea, obiecte pentru a vă conecta numai cele semnificative semnale (de ex, de logare numai clicked semnalul de la butoane)

2021-11-22 12:57:01

Multumesc, acest lucru este foarte util.
Jepessen

În alte limbi

Această pagină este în alte limbi

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