Seznam všechny signály vysílané z qt aplikace

0

Otázka

Já jsem zdědil dědictví qt gui aplikace. Jeden z první věc, kterou musím udělat, je vytvořit log soubor, kde každá interakce s uživatelem je zaznamenána, stejně jako kliknutí na tlačítko upravit v QLineEdit, a tak dále. To vzhledem k tomu, že uživatelé zřejmě nejsou schopni říct, jak reprodukovat konkrétní chyby, takže chtějí, když chyba je otevřel, přečtěte si tento log souboru, aby ověřil, zda kroky, které uživatel provádí, když ji našel.

Viděl jsem, že je možné přepsat notify metoda v QCoreApplication s cílem získat všechny události, a to funguje, ale to není to, co chci, protože se zdá, spravovat pouze události operačního systému, jako je zaměření, atd., a to nezpracovává výstupu signálů.

Samozřejmě můžu změnit kód a vytvořit spojení mezi nimi, například, textChanged signály a lambda, který hlásí, ale v tomto případě budu muset změnit všechny che kód. Existuje způsob, jak dosáhnout stejného výsledku jiným způsobem, aniž by přepisování největší část aplikace?

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

Nejlepší odpověď

1

Můžete uvést všechny widgety v aplikaci pomocí QApplication::allWidgets().

Pak byste mohli vyjmenovat všechny signály z každého widgetu (s QObject::metaObject()) a jejich připojení do ústředny.

Rychlý příklad:

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

Budete muset zlepšit kód, pokud chcete zobrazit parametry.

Můžete také filtrovat objekty přihlásit pouze významné signály (pro ex, přihlášení pouze clicked signál z tlačítka)

2021-11-22 12:57:01

Díky, to je velmi užitečné.
Jepessen

V jiných jazycích

Tato stránka je v jiných jazycích

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