开发者

how to implement mouseEnter and mouseLeave event in QWidget?

how to implement mouseEnter and mouseLeave event in QWidget?

if the mouseEnter to the QWidget then i need to set the Background color into Gray, if the mouseLeave from the QWidget then i need to set the background color is white

i tried

void enterEvent(QEvent *);
void leaveEvent(QEvent *);

in the inside of the enter&leave event i am using bool varibale set true & false. and i am calling the QPainter event update();

the code below:

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();
}

i am getting following error when i am moving the mouse in the 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

Please help me to fix this. if any one having sample code please provide me....


QWidgets also support the underMouse method which could be used instead of the StyleOption or Attribute solution:

if(underMouse()){
    painter.fillRect(QRect(0,0,width(),height()),Qt::white);}
else{
    painter.fillRect(QRect(0,0,width(),height()),Qt::gray);}


Use the styles.

Most widget support the :hover pseudo state, set the backgroundcolor property for your widget in the style

test->setStyleSheet(":hover {background-color: #dddddd;}");

or do it through designer, which is even more convenient, if you need to do custom drawing do it. but you don't need to do it for anything that just changes basic widget looks.


First I would use a member to save the current background color instead of a boolean. This will simplify the paintEvent code:

painter.fillRect(QRect(...), m_backColor);

I guess the errors appears for the first QPainter. Why are you using a QPainter to fill the image? If the var is a QImage you can use the fill function by example and the call drawImage as you do. You have the same kind of function for QPixmap.


Another way: Use QStyleOption.

QStyleOption sopt;
sopt.initFrom(this);
if(sopt.state & QStyle::State_MouseOver)
{
    painter.fillRect(QRect(...), m_colorHover);
}
else
{
    painter.fillRect(QRect(...), m_colorNotHover);
}

Don't need use extra variable, like _mouseMove

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜