Zoznam všetkých signály vyžarované z qt aplikácie

0

Otázka

Som zdedia dedičstvo qt gui aplikácie. Jedna z prvých veci, ktoré som potrebujete urobiť, je vytvoriť súbor denníka, kde každý interakciu používateľa je prihlásený, páči kliknite na tlačidlo upraviť a QLineEdit a tak ďalej. To kvôli tomu, že užívatelia zrejme nie sú schopní povedať, ako reprodukovať špecifické chyby, tak chcú, keď chyba je otvorený, prečítajte si tento súbor denníka s cieľom skontrolovať kroky, ktoré používateľ vykonáva, keď mu ho našli.

Videl som, že je možné prepísať notify metódy v QCoreApplication s cieľom získať všetky udalosti, a funguje to, ale to nie je to, čo chcem, pretože sa zdá, že sa správa iba udalosti operačného systému, ako je zamerané atď., a nie je rukoväť na emitting signálov.

Samozrejme, že som si tento kód zmeňte a vytvoriť spojenie medzi, napríklad textChanged signály a lambda, že správy, ale v tomto prípade som sa bude musieť zmeniť všetky che kód. Existuje spôsob, ako dosiahnuť rovnaký výsledok iným spôsobom, bez prepisovanie najviac súčasťou žiadosti?

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

Najlepšiu odpoveď

1

Môžete zobraziť všetky miniaplikácie widget obsiahnuté v aplikácii pomocou QApplication::allWidgets().

Potom by ste mohli vymenovať všetky signály z každého widget (s QObject::metaObject()a pripojiť ich do záznamníka.

Rýchly prí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 musieť zlepšiť kód, ak chcete zobraziť parametre.

Môžete filtrovať predmety prihlásiť iba významné signály (pre ex, len prihlásení clicked signál z tlačidiel)

2021-11-22 12:57:01

Vďaka, to je veľmi užitočné.
Jepessen

V iných jazykoch

Táto stránka je v iných jazykoch

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