Elenco di tutti i segnali emessi dall'applicazione qt

0

Domanda

Ho ereditato un retaggio qt gui. Una delle prima cosa che devo fare è creare un file di registro in cui ogni interazione dell'utente è registrato, come il clic di un pulsante, la modifica di una QLineEdit e così via. Questo a causa del fatto che gli utenti a quanto pare non sono in grado di dire come riprodurre il bug specifici, in modo che vogliono, quando un bug, per leggere il file di registro per controllare i passaggi che l'utente ha eseguito quando l'ha trovato.

Ho visto che è possibile ignorare il notify metodo QCoreApplication al fine di ottenere tutti gli eventi, e funziona, ma non è quello che voglio, dato che sembra gestire solo gli eventi del sistema operativo, come la messa a fuoco, ecc, e non gestisce l'emissione dei segnali.

Certo che posso modificare il codice e creare un collegamento tra, per esempio, un textChanged segnali e lambda che i rapporti, ma in questo caso devo cambiare tutti che codice. C'è un modo per ottenere lo stesso risultato in un altro modo, senza riscrivere la maggior parte della domanda?

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

Migliore risposta

1

È possibile elencare tutti i widget nella vostra applicazione utilizzando QApplication::allWidgets().

Quindi, si potrebbe fare un elenco di tutti i segnali di ogni widget (con QObject::metaObject()) e di collegarli a un logger.

Un esempio veloce:

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

Dovrete migliorare il codice se si desidera visualizzare i parametri.

Inoltre, è possibile filtrare gli oggetti di accedere solo le significativi segnali (per esempio, la registrazione solo l' clicked segnale di pulsanti)

2021-11-22 12:57:01

Grazie, questo è molto utile.
Jepessen

In altre lingue

Questa pagina è in altre lingue

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