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

时间:2010-12-02 08:40:08

标签: qt

如何在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

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

4 个答案:

答案 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