我繼承了一個舊的 qt gui 應用程式。我需要做的第一件事是創建一個日志檔案,其中記錄了每個用戶互動,例如單擊按鈕、編輯 QLineEdit 等。這是因為用戶顯然無法告訴如何重現特定錯誤,因此他們希望在打開錯誤時讀取此日志檔案,以檢查用戶在發現它時執行的步驟。
我已經看到可以覆寫該notify方法QCoreApplication以獲取所有事件,并且它可以作業,但這不是我想要的,因為它似乎只管理作業系統的事件,例如聚焦等,并且它沒有處理信號的發射。
當然,我可以更改代碼并在textChanged信號和報告它的 lambda之間創建連接,但在這種情況下,我需要更改所有 che 代碼。有沒有辦法以另一種方式實作相同的結果,而無需重寫應用程式的大部分內容?
uj5u.com熱心網友回復:
您可以使用 列出應用程式中的所有小部件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來自按鈕的信號)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/368580.html
