Qt - 重新实现QWidget :: event()

时间:2016-03-02 17:52:45

标签: c++ qt events

问题:

我从QToolButton派生了一个类并重新实现了事件函数,因此我可以访问QHover事件 - 我可以这样做。然而,按钮已经失去了一些其他功能,就像我正在处理的事件一样。例如,按钮不会在视觉上被按下(当您点击它们时),它们所在的QButtonGroup似乎没有关于它们的任何信息(例如,{{ 1}}总是假的,似乎没有信号发射。在下面的代码中,您可以看到我开始沿着跟踪按钮状态的方向前进,但这让我感到困扰,因为我知道我错过了一些非常简单但非常重要的事情 - 把事情搞砸了。

我尝试的事情:

  • 我尝试在案例块中添加isChecked()event->ignore(),但问题仍然相同(忽略,接受,错误,真实,没有任何影响任何差异)
  • 我使用return false结束了事件功能,因为尽可能我在文档中找到了你如何传递事件,但它显然没有做我认为的事情和&#t} #39; s应该做
  • (阅读melak47评论后补充说):我也在return QWidget::event(event)QWidget::event之间来回平息无效。后一种实现看起来似乎是更正确的做事方式,但由于它没有改变我在其他代码中看到的任何东西。
  • 如果我注释掉整个事件功能,按钮会恢复功能(但当然,我无法看到悬停事件)。我可以让this->QToolButton::event偷看进入和离开事件,但我试图避免让父母拦截孩子的事件,如果孩子可以自己做。< / LI>
eventFilter

我一直在阅读的文档和书籍使得这听起来如此简单,而且当我在网上看时,没有人遇到这个问题;这让我觉得它可能很容易,但我只是缺少一些基本概念。

非常感谢任何见解

1 个答案:

答案 0 :(得分:0)

为什么要在事件功能中调用mousePressEventmouseReleaseEvent函数重新实现?我认为这就是问题所在!那些是虚函数,因此QToolButton::event将在内部调用您的实现,而不是调用原始函数!

以下代码应该做正确的事 - 通过正确覆盖函数:

class NavButton : public QToolButton()
{
        //...
    protected:
        void mousePressEvent(QMouseEvent *ev) Q_DECL_OVERRIDE {
            /*repaint();*/
            QToolButton::mousePressEvent(ev);
        }
        void mouseReleaseEvent(QMouseEvent *ev) Q_DECL_OVERRIDE {
            emit stateChanged(id, state);
            QToolButton::mouseReleaseEvent(ev);
        }
        void hoverEnter(QHoverEvent *) {
            setIcon(QIcon(hIcon));
        }
        void hoverLeave(QHoverEvent *) {
            QIcon icon = (state) ? aIcon : iIcon;
            setIcon(icon);
        }

        bool event(QEvent *event) Q_DECL_OVERRIDE {
            switch(event->type()) {
            case QEvent::HoverEnter:
                hoverEnter((QHoverEvent*)(event));
                break;
            case QEvent::HoverLeave:
                hoverLeave((QHoverEvent*)(event));
                break;
            default:
                break;
            }

            return QToolButton::event(event);
        }

    //...
}; 

所有已被覆盖的事件处理程序现在都会调用基类的处理程序。在您的事件处理程序中,您只需要调用您自己创建的特定处理程序! (Q_DECL_OVERRIDE - 宏表示您正在覆盖某个函数。)