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.也就是说,一上来就移出去了。
效果就是一个窗口,启动时屏幕只显示一半的的窗口,鼠标进入后就慢慢的全显示出来,鼠标离开后,又慢慢的向左缩到一半显示,类似停靠窗口的概念,这样是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.也就是说,一上来就移出去了。
相关文章推荐
- [Qt教程] 第2篇 在Ubuntu14.04上创建Qt 5.4.0开发环境
- 在QTreeWidget中删除QTreeWidgetItem
- Qt常用技能总结
- 用vs创建Qt form并和对应的form类关联
- Ubuntu 14.10 编译 qt4.8.6
- Qt QScrollBar qss 美化样例
- qt 获取 xml
- qt5 不同窗口的信息传递
- 与 QWidget 有关的 Qt 可视化组件的继承关系图
- QT和MFC比较
- qt状态机和动画框架
- QT的动画框架 概述
- QTP 10和QTP 11 破解方法
- cmake编译QT5串口通信
- Qt常用快捷键
- QTP 11.5改名为 UFT
- 如何实现QT程序开机自启动
- Qt程序的UAC权限问题(转载)
- 详细,Qt Creator快捷键大全,附快捷键配置方法
- 在Qt Creator 和在 vs2012 里添加信号和槽