在输入事件时填写QRect

时间:2014-03-10 08:30:01

标签: c++ qt

我有一个任务:当鼠标光标进入时,应该绘制QRect对象。 几个小时后我做了这个。

void myObj::mouseMoveEvent(QMouseEvent* event){   
    int x1, y1, x2, y2;
    QPoint point = event->pos();
    rect->getCoords(&x1, &y1, &x2, &y2);
    if((point.x() >= x1) && (point.x() <= x2) && (point.y() >= y1) && (point.y() <= y2)){
       changeRectColour();
    }else{
       brush->setColor(Qt::green);
       repaint();
    }
}

myObj继承自QWidget。 但我认为我的想法并不高效。因为在每次鼠标移动到QRect外面时,它会将颜色变为绿色(即使它是绿色)。 不幸的是,QRect还没有进入事件()函数。 请你能正确地提出如何做到这一点的建议。

2 个答案:

答案 0 :(得分:3)

QWidget::repaint()意味着“现在画画!!!我等不及了!”。请改用QWidget::update(),这会将多个绘制请求合并为一个(在文档中有更好的解释)。

顺便说一下,你基本上是重新实现QRect::contains()。您的新代码将是

void myObj::mouseMoveEvent(QMouseEvent* event){   

    QPoint point = event->pos();
    if(rect->contains(point, true)){
       changeRectColour(); 
    }
    else{
       brush->setColor(Qt::green);
       update();
    }
}

答案 1 :(得分:0)

您可以创建一个布尔类成员,例如_lastPositionWasInsideRect,将其初始化为false并将if语句编程为:

bool positionIsInsideRect = (point.x() >= x1) && (point.x() <= x2) && (point.y() >= y1) && (point.y() <= y2));

if( positionIsInsideRect && !_lastPositionWasInsideRect )
{
    _lastPositionWasInsideRect = true;
    // do the changes which are required when entering the rect
}
else if( !positionIsInsideRect && _lastPositionWasInsideRect )
{
    _lastPositionWasInsideRect = false;
    // do the changes which are required when leaving the rect     
}

更容易的替代方案是考虑使用QGraphicsView框架。