Lista de todas las señales emitidas desde la aplicación qt

0

Pregunta

He heredado un legado qt gui de la aplicación. Uno de los primero que debo hacer es crear un archivo de registro donde cada interacción con el usuario se registra, como el clic de un botón, la edición de un QLineEdit y así sucesivamente. Esto debido al hecho de que los usuarios son aparentemente no ser capaz de decir cómo reproducir errores específicos, por lo que quieren, cuando un error se abrió, para leer este archivo de registro con el fin de comprobar los pasos que el usuario lleva a cabo cuando la encontró.

He visto que es posible reemplazar la notify método en QCoreApplication con el fin de obtener todos los eventos, y funciona, pero no es lo que quiero, ya que parece manejar sólo los eventos del sistema operativo, como enfocarse etc, y no controla la emisión de las señales.

Por supuesto que puede cambiar el código y crear una conexión entre, por ejemplo, un textChanged señales y una lambda de que los informes, pero en este caso voy a necesitar cambiar todos che código. Hay una manera de lograr el mismo resultado en otra forma, sin tener que reescribir la mayor parte de la aplicación?

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

Mejor respuesta

1

Puedes ver la lista de todos los widgets de la aplicación, mediante QApplication::allWidgets().

A continuación, podría lista de todas las señales de cada widget (con QObject::metaObject()) y conectarlos a un registrador.

Un ejemplo rápido:

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

Tendrás que mejorar el código si desea mostrar los parámetros.

También puedes filtrar los objetos para registrar sólo las importantes señales (por ejemplo, solo el registro de la clicked la señal de botones)

2021-11-22 12:57:01

Gracias, es muy útil.
Jepessen

En otros idiomas

Esta página está en otros idiomas

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