Liste de tous les signaux émis à partir de l'application qt

0

La question

J'ai hérité d'un héritage qt gui application. Une des première chose que j'ai besoin de faire est de créer un fichier journal où chaque interaction de l'utilisateur est connecté, comme le clic d'un bouton, de l'édition d'un QLineEdit et ainsi de suite. Cela est dû au fait que les utilisateurs sont apparemment à ne pas être en mesure de dire comment reproduire bogues spécifiques, de sorte qu'ils veulent, quand un bug est ouvert, pour lire ce fichier journal afin de vérifier les étapes que l'utilisateur a effectué lorsqu'il l'a trouvée.

J'ai vu qu'il est possible de remplacer le notify méthode QCoreApplication afin d'obtenir tous les événements, et il fonctionne, mais ce n'est pas ce que je veux, car il semble à gérer que les événements du système d'exploitation, comme en se concentrant etc, et il ne gère pas l'émission de signaux.

Bien sûr, je peux modifier le code et de créer un lien entre, par exemple, un textChanged signaux et un lambda que les rapports, mais dans ce cas j'ai besoin de changer tous les che code. Est-il possible d'obtenir le même résultat d'une autre manière, sans avoir à réécrire la plus grande partie de la demande?

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

La meilleure réponse

1

Vous pouvez dresser la liste de tous les widgets dans votre application à l'aide de QApplication::allWidgets().

Ensuite, vous pouvez lister tous les signaux de chaque widget (avec QObject::metaObject()) et de les connecter à un enregistreur.

Un exemple rapide:

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

Vous aurez à améliorer le code, si vous souhaitez afficher les paramètres.

Vous pouvez également filtrer les objets d'enregistrer uniquement l'important signaux (par ex, l'enregistrement seulement l' clicked signal de boutons)

2021-11-22 12:57:01

Merci, c'est très utile.
Jepessen

Dans d'autres langues

Cette page est dans d'autres langues

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