您的位置:首页 > 编程语言 > Qt开发

qt 实现停靠窗口 效果

2015-06-25 13:43 633 查看
我创建了一个class继承QWidget,实现enterEvent和leaveEvent两个函数,我实现的效果是这样,一开始这个窗口显示出来,但只显示一半,就是move(-width/2),一旦有鼠标进入的消息,就起个timeline去一点儿一点儿的向右move,直到全都显示出来。

效果就是一个窗口,启动时屏幕只显示一半的的窗口,鼠标进入后就慢慢的全显示出来,鼠标离开后,又慢慢的向左缩到一半显示,类似停靠窗口的概念,这样是OK的,但是问题来了,

这是从左往右慢慢显示的,是没问题,当我从右往左显示的时候就出问题了。

现象是,开始在屏幕右边显示一半的窗口,当鼠标进入窗口时,会进入enterEvent消息,这时候窗口往左move,但这时move完就会马上进入leaveEvent事件,但是这个move执行完时,鼠标依然是在窗口上的,为什么会进入leaveEvent事件呢?这个我很奇怪。

初始化:

this->setFixedSize(50, 60);//设置窗口大小

mTimerEnter = new QTimeLine(500, this);

mTimerEnter->setFrameRange(0,w/2);//max value

mTimerEnter->setCurveShape(QTimeLine::LinearCurve);

mTimerEnter->setEasingCurve(QEasingCurve::OutCubic);

mTimerEnter->setUpdateInterval(20);//step

connect(mTimerEnter, SIGNAL(frameChanged(int)), this, SLOT(showWindowAnimation(int)));

mTimerLeave = new QTimeLine(500, this);

mTimerLeave->setFrameRange(0,w/2);//max value

mTimerLeave->setCurveShape(QTimeLine::LinearCurve);

mTimerLeave->setEasingCurve(QEasingCurve::OutCubic);

mTimerLeave->setUpdateInterval(20);//step

connect(mTimerLeave, SIGNAL(frameChanged(int)), this, SLOT(hideWindowAnimation(int)));

动画绘制:

void DocWindow::showWindowAnimation(int value)

{

int w = this->size().width();

int screen_width = QApplication::desktop()->width();

qDebug() << "showWindowAnimation value:" << value <<"screen_width:"<< screen_width;

if(g_im_setting_param.nPanel_hidetype == HIDE_TO_LEFT)

{

this->move(-w/2+value-OFFSET, 100);

}

else if( g_im_setting_param.nPanel_hidetype == HIDE_TO_RIGTH )

{

this->move(screen_width-value, 100);

}

}

void DocWindow::hideWindowAnimation(int value)

{

int w = this->size().width();

qDebug() << "hideWindowAnimation value:" << value;

if(g_im_setting_param.nPanel_hidetype == HIDE_TO_LEFT)

{

this->move(-value-OFFSET, 100);

this->move(-value-OFFSET, 100);

}

else if( g_im_setting_param.nPanel_hidetype == HIDE_TO_RIGTH )

{

int screen_width = QApplication::desktop()->width();

this->move(screen_width-w+value, 100);

}

}

事件:

void DocWindow::enterEvent(QEvent *event)

{

qDebug() << "DocWindow enterEvent";

if(mTimerEnter->state() == QTimeLine::Running)

{

mTimerEnter->stop();

}

if(mTimerLeave->state() == QTimeLine::Running)

{

mTimerLeave->stop();

}

mTimerEnter->start();

return QWidget::enterEvent(event) ;

}

void DocWindow::leaveEvent(QEvent *event)

{

qDebug() << "DocWindow leaveEvent";

if(mTimerEnter->state() == QTimeLine::Running)

{

mTimerEnter->stop();

}

if(mTimerLeave->state() == QTimeLine::Running)

{

mTimerLeave->stop();

}

mTimerLeave->start();

return QWidget::leaveEvent(event) ;

}

解决了,是鼠标刚进入窗口的时候,动画绘制的坐标错误,

this->move(screen_width-value, 100);第一次value是0.也就是说,一上来就移出去了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: