实现mouseDoubleClickEvent时不会发出itemDoubleClicked信号

时间:2015-08-09 04:10:31

标签: c++ qt

我正在实现一个继承QTreeWidget的类, 我只是在用户左键单击某个项目时尝试做某事。 由于itemDoubleClicked仅为您提供项而非鼠标事件, 和mouseDoubleClickEvent只为你提供没有项目的鼠标事件, 所以我想我会在类中添加一个成员并记录mouseDoubleClickEvent中是否按下了左键或右键, 然后在进入连接到信号itemDoubleClicked的插槽时检查该信息。 也就是说,如果在事件处理程序之后发出信号。如果这是真的,我打算进行实验,但后来我遇到了这个问题。 好的,回到课堂上,它看起来像这样:

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的限制吗? 我只能在信号和插槽以及事件处理程序之间选择一个吗? 或者我只是做错了?

此外,如果这是一个限制, 你能为我想要的东西推荐另一种解决方案吗? (仅响应左键双击)

很抱歉很长的帖子,谢谢!

1 个答案:

答案 0 :(得分:0)

如果覆盖某个事件处理程序并且还需要默认行为,则应调用基本处理程序实现。例如,试试这个:

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