2015-08-09 173 views
2

我正在實現一個類,繼承QTreeWidget, 我只是試圖做一些事情,只有當用戶左鍵點擊一個項目。 由於itemDoubleClicked只給你的項目,而不是鼠標事件, 和mouseDoubleClickEvent只給你沒有項目的鼠標事件, 所以我想我會在類中添加一個成員,並記錄在mouseDoubleClickEvent中是否按下了左或右按鈕, 然後在進入連接到信號itemDoubleClicked的插槽時檢查該信息。 也就是說,如果信號是在事件處理程序之後發出的。我打算試驗這是否屬實,但後來我遇到了這個問題。 好了,回類,它看起來是這樣的:itemDoubleClicked信號沒有發射時,實施mouseDoubleClickEvent

class myTreeWidget : public QTreeWidget{ 
    Q_OBJECT 

    private: 
     Qt::MouseButton m_button; 

    public: 
     myTreeWidget(QWidget* parent):QTreeWidget(parent){ 
      m_button = Qt::NoButton; 
      connect(this, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), 
        this, SLOT(slot_doubleClick(QTreeWidgetItem*,int))); 
     } 

     void mouseDoubleClickEvent(QMouseEvent* event){ 
      m_button = event->button(); 
     } 

    public slots: 
     void slot_doubleClick(QTreeWidgetItem* item, int column); 

    signals: 
     void itemDoubleClicked(QTreeWidgetItem* item, int column); 
} 

沒錯,是這樣的。 然後我使用gdb檢查哪個被調用第一個, mouseDoubleClickEvent或slot_doubleClick, ,事實證明,根本沒有調用slot_doubleClick。 我註釋掉了mouseDoubleClickEvent並重試, 和slot_doubleClick被調用。

所以嗯...我在這裏問的是... 這是Qt的限制嗎? 我只能在信號&插槽和事件處理程序之間選擇一個嗎? 或者我只是做錯了嗎?

此外,如果這是一個限制, 你可以推薦另一個解決方案,我想要做什麼? (只響應左鍵雙擊)

對不起,對這篇長文章感謝!

回答

0

如果您重寫某些事件處理程序並且還想要默認行爲,則應該調用基礎處理程序實現。例如試試這個:

void mouseDoubleClickEvent(QMouseEvent* event){ 
    m_button = event->button(); 
     QTreeWidget::mouseDoubleClickEvent(event); 
} 
+0

Arrrrrgh !!謝謝!! OMG現在感覺如此遲鈍... – nancyheidilee