如何在QWidget中实现mouseEnter和mouseLeave事件?
如果mouseEnter到QWidget然后我需要将Background颜色设置为Gray, 如果mouseWave从QWidget然后我需要设置背景颜色是白色
我试过
void enterEvent(QEvent *);
void leaveEvent(QEvent *);
在输入和离开事件的内部我正在使用bool varibale set true&假。我正在调用QPainter事件更新();
以下代码:
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
请帮我解决这个问题。如果任何人有示例代码,请提供给我....
答案 0 :(得分:5)
使用styles。
大多数小部件支持:hover
伪状态,以样式设置小部件的backgroundcolor属性
test->setStyleSheet(":hover {background-color: #dddddd;}");
或者通过设计师来做,如果你需要做自定义绘图,那就更方便了。但是你不需要为任何只改变基本小部件外观的东西做这件事。
答案 1 :(得分:3)
QWidgets还支持可用于代替StyleOption或Attribute解决方案的underMouse
方法:
if(underMouse()){
painter.fillRect(QRect(0,0,width(),height()),Qt::white);}
else{
painter.fillRect(QRect(0,0,width(),height()),Qt::gray);}
答案 2 :(得分:2)
首先,我会使用一个成员来保存当前的背景颜色而不是布尔值。这将简化paintEvent代码:
painter.fillRect(QRect(...), m_backColor);
我猜第一个QPainter会出现错误。为什么使用QPainter来填充图像?如果var是QImage,您可以使用fill function示例和调用drawImage。您对QPixmap具有相同的功能。
答案 3 :(得分:0)
另一种方式: 使用QStyleOption。
QStyleOption sopt;
sopt.initFrom(this);
if(sopt.state & QStyle::State_MouseOver)
{
painter.fillRect(QRect(...), m_colorHover);
}
else
{
painter.fillRect(QRect(...), m_colorNotHover);
}
不需要使用额外的变量,例如_mouseMove