2015-08-09 22 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