2014-07-01 24 views
0

當光標位於分離器下方時,我需要爲QSplitter處理雙擊。Qt。了QSplitter。當光標位於分離器下時處理雙擊

我重新定義了mouseDoubleClickEvent。但這不適用於這種情況。

當光標在分離器下方時(準備移動分離器),當我點擊doulble時,該方法不會調用。

+1

究竟什麼是行不通的? – Ashot

+0

@ Ashot:「不起作用」顯然這裏的意思是「沒有任何反應」。 –

回答

2

您可以使用事件過濾器過濾去的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); 

    ... 
} 
0

我需要相同的功能,以便在用戶雙擊手柄(這是我的用例)時,能夠均勻地將分離器中的小部件分隔開。覆蓋QSplitter.mouseDoubleClickEvent()不起作用,因爲它似乎處理消耗雙擊事件本身,因此它不會傳播到父項QSplitter。在接受的答案中使用eventFilter建議的解決方案非常好,但缺點是它不是「動態」的,即當用戶在運行時向分離器添加新的小部件時,未安裝事件過濾器。所以我們需要找到一種動態安裝事件過濾器的方法。有兩種方法來實現:

  1. 覆蓋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

  1. 攔截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++。

相關問題