簡體   English   中英

列出從 qt 應用程序發出的所有信號

[英]list all signals emitted from qt application

我繼承了舊版 qt gui 應用程序。 我需要做的第一件事是創建一個記錄每個用戶交互的日志文件,例如單擊按鈕、編輯 QLineEdit 等等。 這是因為用戶顯然不知道如何重現特定的錯誤,因此他們希望在打開錯誤時讀取此日志文件,以便檢查用戶在找到它時執行的步驟。

我已經看到可以覆蓋QCoreApplication中的notify方法以獲取所有事件,並且它可以工作,但這不是我想要的,因為它似乎只管理操作系統的事件,例如聚焦等,而且它不處理信號的發射。

當然,我可以更改代碼並在例如textChanged信號和報告它的 lambda 之間創建連接,但在這種情況下,我需要更改所有 che 代碼。 有沒有辦法以另一種方式實現相同的結果,而無需重寫應用程序的大部分內容?

您可以使用QApplication::allWidgets()列出應用程序中的所有小部件。

然后,您可以列出每個小部件的所有信號(使用QObject::metaObject() )並將它們連接到logger

一個簡單的例子:

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

如果要顯示參數,則必須改進代碼。

您還可以過濾對象以僅記錄重要信號(例如,僅記錄按鈕clicked的信號)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM