当实现mouseDoubleClickEvent时,不会发出itemdoubleclick信号

itemDoubleClicked signal is not emitted when mouseDoubleClickEvent is implemented

本文关键字:itemdoubleclick 信号 实现 mouseDoubleClickEvent      更新时间:2023-10-16

我正在实现一个继承QTreeWidget的类,我试图做一些只有当用户左键点击一个项目。因为itemdoubleclick只给你项目而不是鼠标事件,而mouseDoubleClickEvent只给你没有项目的鼠标事件,所以我想我会在类中添加一个成员记录下鼠标双击事件中是否按下了左键或右键,然后在进入连接到信号itemdoubleclick的插槽时检查该信息。也就是说,如果信号是在事件处理程序之后发出的。如果这是真的,我打算做实验,但后来我遇到了这个问题。好,回到类,它看起来像这样:

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);
}