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事件?的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript 原型自定义事件mouseenter mouseleave实现
原型自定义事件mouseenter mouseleave实现
按钮/图像切换资源使用click,MouseEnter和MouseLeave