问题:
我从QToolButton
派生了一个类并重新实现了事件函数,因此我可以访问QHover事件 - 我可以这样做。然而,按钮已经失去了一些其他功能,就像我正在处理的事件一样。例如,按钮不会在视觉上被按下(当您点击它们时),它们所在的QButtonGroup
似乎没有关于它们的任何信息(例如,{{ 1}}总是假的,似乎没有信号发射。在下面的代码中,您可以看到我开始沿着跟踪按钮状态的方向前进,但这让我感到困扰,因为我知道我错过了一些非常简单但非常重要的事情 - 把事情搞砸了。
我尝试的事情:
isChecked()
和event->ignore()
,但问题仍然相同(忽略,接受,错误,真实,没有任何影响任何差异)return false
结束了事件功能,因为尽可能我在文档中找到了你如何传递事件,但它显然没有做我认为的事情和&#t} #39; s应该做return QWidget::event(event)
和QWidget::event
之间来回平息无效。后一种实现看起来似乎是更正确的做事方式,但由于它没有改变我在其他代码中看到的任何东西。this->QToolButton::event
偷看进入和离开事件,但我试图避免让父母拦截孩子的事件,如果孩子可以自己做。< / LI>
eventFilter
我一直在阅读的文档和书籍使得这听起来如此简单,而且当我在网上看时,没有人遇到这个问题;这让我觉得它可能很容易,但我只是缺少一些基本概念。
非常感谢任何见解
答案 0 :(得分:0)
为什么要在事件功能中调用mousePressEvent
和mouseReleaseEvent
函数重新实现?我认为这就是问题所在!那些是虚函数,因此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
- 宏表示您正在覆盖某个函数。)