當光標位於分離器下方時,我需要爲QSplitter處理雙擊。Qt。了QSplitter。當光標位於分離器下時處理雙擊
我重新定義了mouseDoubleClickEvent。但這不適用於這種情況。
當光標在分離器下方時(準備移動分離器),當我點擊doulble時,該方法不會調用。
當光標位於分離器下方時,我需要爲QSplitter處理雙擊。Qt。了QSplitter。當光標位於分離器下時處理雙擊
我重新定義了mouseDoubleClickEvent。但這不適用於這種情況。
當光標在分離器下方時(準備移動分離器),當我點擊doulble時,該方法不會調用。
您可以使用事件過濾器過濾去的Qsplitter
手柄的所有事件:
bool MyClass::eventFilter(QObject * obj, QEvent * event)
{
if(event->type()==QEvent::MouseButtonDblClick)
{
...
}
return false;
}
也不要忘了在類的構造函數來安裝事件過濾器:
MyClass::MyClass(QWidget *parent):QWidget(parent)
{
...
ui->splitter->handle(1)->installEventFilter(this);
...
}
我需要相同的功能,以便在用戶雙擊手柄(這是我的用例)時,能夠均勻地將分離器中的小部件分隔開。覆蓋QSplitter.mouseDoubleClickEvent()
不起作用,因爲它似乎處理消耗雙擊事件本身,因此它不會傳播到父項QSplitter
。在接受的答案中使用eventFilter
建議的解決方案非常好,但缺點是它不是「動態」的,即當用戶在運行時向分離器添加新的小部件時,未安裝事件過濾器。所以我們需要找到一種動態安裝事件過濾器的方法。有兩種方法來實現:
QSplitter.addWidget()
和QSplitter.insertWidget()
:# inside class MySplitter
def addWidget(self, widget):
super(MySplitter, self).addWidget(widget) # call the base class
self.handle(self.count() - 1).installEventFilter(self)
def insertWidget(self, index, widget):
super(MySplitter, self).insertWidget(index, widget) # call the base class
self.handle(index).installEventFilter(self)
但是當用戶不使用這兩種方法,但通過添加小部件,這是一個有點問題將父項設置爲子窗口小部件,儘管文檔不鼓勵這樣做 - 請參閱:http://doc.qt.io/qt-5/qsplitter.html#childEvent
childEvent()
,這感覺有點哈克卻是錯誤的證明:# inside class MySplitter
def childEvent(self, event):
if event.added():
# Note that we cannot test isinstance(event.child(), QSplitterHandle)
# because at this moment the child is of type QWidget,
# it is not fully constructed yet.
# So we assume (hacky but it works) that the splitter
# handle is added always as the second child after
# the true child widget.
if len(self.children()) % 2 == 0:
event.child().installEventFilter(self)
super(MySplitter, self).childEvent(event) # call the base class
我使用b)和它的作品對我來說相當不錯。這樣做的好處是您不需要子類(但是,爲了簡單起見,我們可以),您可以安裝另一個事件過濾器來攔截childEvent
並從外部安裝事件過濾器。
對不起,我的代碼是在PyQt中,但我認爲它是足夠的慣用和易於轉換爲C++。
究竟什麼是行不通的? – Ashot
@ Ashot:「不起作用」顯然這裏的意思是「沒有任何反應」。 –