【问题标题】:how to implement mouseEnter and mouseLeave event in QWidget?QWidget中如何实现mouseEnter和mouseLeave事件?
【发布时间】: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 样式表还允许根据悬停状态进行不同的设置。

标签: 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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-14
          • 1970-01-01
          相关资源
          最近更新 更多