QWidget中如何实现mouseEnter和mouseLeave事件?

Posted

技术标签:

【中文标题】QWidget中如何实现mouseEnter和mouseLeave事件?【英文标题】:how to implement mouseEnter and mouseLeave event in QWidget? 【发布时间】:2010-12-02 08:40:08 【问题描述】:

QWidget如何实现mouseEnter和mouseLeave事件?

如果 mouseEnter 到 QWidget 那么我需要将背景颜色设置为灰色, 如果来自 QWidget 的 mouseLeave 则我需要将背景颜色设置为白色

我试过了

void enterEvent(QEvent *);
void leaveEvent(QEvent *);

在 enter&leave 事件的内部,我使用 bool varibale set true & false。我正在调用 QPainter 事件 update();

下面的代码:

void Test::enterEvent(QEvent *)

   _mouseMove=true;
    update();



void Test::leaveEvent(QEvent *)

   _mouseMove=false;
    update();



void Test::paintEvent(QPaintEvent *)

    QPainter painter;
    painter.begin(&m_targetImage);
    painter.setRenderHint(QPainter::Antialiasing);

        if(_mouseMove)
            painter.fillRect(QRect(0,0,width(),height()),Qt::white);
        else
            painter.fillRect(QRect(0,0,width(),height()),Qt::gray);

    painter.end();

    QPainter p;
    p.begin(this);
    p.drawImage(0, 0, m_targetImage);
    p.end();

当我在 QWidget 中移动鼠标时出现以下错误

QPainter::begin: Paint device returned engine == 0, type: 3
QPainter::setRenderHint: Painter must be active to set rendering hints
QPainter::end: Painter not active, aborted

请帮我解决这个问题。如果有人有示例代码,请提供给我....

【问题讨论】:

您还可以监听悬停事件,它们自己执行 update()。 Qt 样式表还允许根据悬停状态进行不同的设置。 【参考方案1】:

QWidgets 还支持underMouse 方法,可以用来代替 StyleOption 或 Attribute 解决方案:

if(underMouse())
    painter.fillRect(QRect(0,0,width(),height()),Qt::white);
else
    painter.fillRect(QRect(0,0,width(),height()),Qt::gray);

【讨论】:

【参考方案2】:

使用styles。

大部分小部件都支持:hover 伪状态,请在样式中为您的小部件设置背景颜色属性

test->setStyleSheet(":hover background-color: #dddddd;");

或者通过设计师来做,更方便,如果你需要做自定义绘图的话。但您不需要为仅更改基本小部件外观的任何事情执行此操作。

【讨论】:

【参考方案3】:

首先我会使用一个成员来保存当前的背景颜色,而不是一个布尔值。这将简化paintEvent代码:

painter.fillRect(QRect(...), m_backColor);

我猜第一个 QPainter 会出现错误。为什么要使用 QPainter 来填充图像?如果 var 是 QImage,您可以通过示例使用 fill function 并像您一样调用 drawImage。 QPixmap 具有相同的功能。

【讨论】:

【参考方案4】:

另一种方式: 使用 QStyleOption。

QStyleOption sopt;
sopt.initFrom(this);
if(sopt.state & QStyle::State_MouseOver)

    painter.fillRect(QRect(...), m_colorHover);

else

    painter.fillRect(QRect(...), m_colorNotHover);

不需要使用额外的变量,例如_mouseMove

【讨论】:

以上是关于QWidget中如何实现mouseEnter和mouseLeave事件?的主要内容,如果未能解决你的问题,请参考以下文章

如何有选择地让 QWidget 接受鼠标点击的焦点?

JavaScript 原型自定义事件mouseenter mouseleave实现

原型自定义事件mouseenter mouseleave实现

按钮/图像切换资源使用click,MouseEnter和MouseLeave

如果我的 mouseenter 函数已经在执行,如何让它不执行?

仅当在 Java 中按下鼠标时如何让 mouseEntered 执行