c++ - 实现 mouseDoubleClickEvent 时不会发出 itemDoubleClicked 信号

标签 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的限制吗? signals&slots 和 event handlers 只能二选一吗? 还是我做错了?

此外,如果这是一个限制, 你能为我正在尝试做的事情推荐另一种解决方案吗? (只响应左键双击)

抱歉发了这么长的帖子,谢谢!

最佳答案

如果您覆盖了一些事件处理程序并且还想要默认行为,您应该调用基本处理程序实现。例如试试这个:

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

关于c++ - 实现 mouseDoubleClickEvent 时不会发出 itemDoubleClicked 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31900820/

相关文章:

c++ - 比较将整数值转换为字符串的 3 种现代 C++ 方法

c++ - 无法链接到 quantlib

c++ - 几乎总是自动和带有计数器的循环

c++ - 使用 Qt 和 Boost 为应用程序编译 CppUTest 测试时的奇怪行为

c++ - 在 Qt 中获取本地 IP 地址

c++ - Qt:小部件方法 addButtons() 不能按需要工作

c++ - 为对话框设置皮肤

c++ - push_back 非指针元素到一行中的 vector

c++ - 处理 QAbstractItemModel::dataChanged() 信号时如何获取旧值?

c++ - VLC-Qt 在 Windows 错误上从源构建