我在不同繼承級別的同一物件上安裝了 2 個事件過濾器。一些舊訊息來源聲稱應用過濾器的順序是相反的安裝順序。這對我來說才有意義,因為派生類的特殊行為通常應該優先于覆寫基類提供的現有行為,而初始化,似乎最好完成事件過濾器安裝,以與此優先級相反的順序進行。
但我發現在我的程式中并非如此。除錯時,我得到與安裝相同的優先順序以及隨后代碼中的問題。由于我涉及到繼承結構,因此我的基類“提供的行為優先于我的派生類”。因此出現了問題,因為兩個過濾器都應該過濾同一個物件并且不是可交換的,在我的情況下,在滾輪滾動上,一個在基類行為的背景關系中,另一個在派生類的特殊情況下用于另一個用途案子。基類的設計應該是關閉的,因此可以訪問設定基類過濾器的代碼,以及過濾器物件本身不被派生類代碼授予。
問題:
因為我在這里得到了相互矛盾的來源,我在檔案中找不到任何東西:
- Qt應該如何設定優先級?
要找到解決此問題的方法:
- 如何影響過濾器的優先級或它們的一般順序?
- 如何實作同樣更好的方式?
示例性偽代碼:
class FilterX{ void eventFilter() { /* do something general */ } };
class A { FilterX filterx; A() { this->installEventFilter(filterx); } };
class B : public A {}; class C : public B{}
class FilterY{ void eventFilter() { /* do something specialized */ } };
void f()
{
C c;
A* a = &c;
c->installEventFilter(filterY);
// ...
}
//Later on event I get execution order
FilterX::eventFilter()
FilterY::eventFilter()
我目前運行 QT LTS 5.15
uj5u.com熱心網友回復:
我很確定檔案是正確的,并且您的代碼中有一些錯誤。
由于您的代碼片段不正確并且包含許多錯誤,因此我對其進行了清理并使其可運行。
#include <QCoreApplication>
#include <QDebug>
class FilterX : public QObject
{
bool eventFilter(QObject *, QEvent *) override
{
qInfo() << "event filter X";
return false;
}
};
class A : public QObject
{
FilterX filterx;
public:
A()
{
installEventFilter(&filterx);
}
};
class C : public A {};
class FilterY : public QObject
{
bool eventFilter(QObject *, QEvent *) override
{
qInfo() << "event filter Y";
return false;
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
C c;
FilterY filterY;
c.installEventFilter(&filterY);
QEvent event(QEvent::Paint); // just an example of an event
QCoreApplication::sendEvent(&c, &event);
return a.exec();
}
如果你運行它,輸出是:
event filter Y
event filter X
即完全符合預期:事件過濾器以它們在物件上安裝的相反順序執行。層次結構的繼承在其中沒有任何作用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/530184.html
