Qt uygulamasından yayılan tüm sinyalleri listele

0

Soru

Eski bir qt guı uygulamasını miras aldım. Yapmam gereken ilk şeylerden biri, bir düğmeye tıklamak, bir qlineedit'in düzenlenmesi vb.Gibi her kullanıcı etkileşiminin kaydedildiği bir günlük dosyası oluşturmaktır. Bunun nedeni, kullanıcıların belirli hataların nasıl yeniden oluşturulacağını söyleyememeleridir, bu nedenle, bir hata açıldığında, kullanıcının bulduğu zaman gerçekleştirdiği adımları kontrol etmek için bu günlük dosyasını okumak isterler.

Bunu geçersiz kılmanın mümkün olduğunu gördüm. notify yöntem içinde QCoreApplication tüm olayları elde etmek için ve işe yarıyor, ancak istediğim şey bu değil, çünkü yalnızca işletim sisteminin olaylarını, odaklanma vb.Gibi Yönetiyor gibi görünüyor ve sinyallerin yayılmasını işlemiyor.

Tabii ki kodu değiştirebilir ve örneğin bir textChanged sinyaller ve bunu bildiren bir lambda, ancak bu durumda tüm che kodunu değiştirmem gerekecek. Uygulamanın çoğunu yeniden yazmadan aynı sonucu başka bir şekilde elde etmenin bir yolu var mı?

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

En iyi cevabı

1

Uygulamanızdaki tüm widget'ları kullanarak listeleyebilirsiniz QApplication::allWidgets().

Ardından, her bir widget'ın tüm sinyallerini listeleyebilirsiniz ( QObject::metaObject()) ve bunları bir kaydediciye bağlayın.

Hızlı bir örnek:

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

Parametreleri görüntülemek istiyorsanız kodu iyileştirmeniz gerekir.

Ayrıca (ex için tek önemli sinyaller günlük nesneleri filtre, tek günlük edebilirsiniz clicked düğmelerden gelen sinyal)

2021-11-22 12:57:01

Teşekkürler, bu çok faydalı.
Jepessen

Diğer dillerde

Bu sayfa diğer dillerde

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