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

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

而且,如果这是一个限制,
您能为我要尝试的方法推荐另一种解决方案吗?
(仅响应左双击)

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

最佳答案

如果重写某些事件处理程序并且还需要默认行为,则应调用基本处理程序实现。例如,尝试以下操作:

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

09-11 19:00