QT鼠标响应
2014-04-16 14:14
232 查看
QT鼠标响应(移动到按钮上按钮有响应)
http://www.tonkv.com/blog/read.php?265#entrymore(原文地址)
在一些华丽的界面程序中,大多数鼠标经过某些组件时,组件就会有些动画效果事件。当然我们可以通过判断组件的hover事 件,但如果只是动画效果,我们倒是可以只设置按钮三种状态不同的动画图片也是简单的。如果需要鼠标经过某些组件时,组件就自动反应并且做一些事情。就要通 过事件完成了。在Qt中有mouseMoveEvent()事件,但它必须在按下去才会有事件的产生。因此我们需要激活组件的鼠标追踪属性;
setMouseTracking
(
true
); //这是激活整个窗体的鼠标追踪
Qtbtn_1
->
setMouseTracking
(
true
); //进入某个按钮时,鼠标追踪属性失效,因此我们也需要激活该按钮的鼠标追踪功能
Qtbtn_2
->
setMouseTracking
(
true
);
然后再实现mouseMoveEvent()事件
void
MenuForm
::
mouseMoveEvent
(
QMouseEvent
*
e
)
{
e
->
accept
();
if
(
enterBtn
(
e
->
pos
(),
Qtbtn_1
))
Qlab_context
->
setText
(
"这是第一个按钮"
);
if
(
enterBtn
(
e
->
pos
(),
Qtbtn_2
))
Qlab_context
->
setText
(
"这是第二个按钮"
);
}
这里我使用另一个函数来完成判断鼠标是否在一个按钮区域内,如果在区域内只返回真,否则返回假
bool
MenuForm
::
enterBtn
(
QPoint
pp
,
QToolButton
*
btn
)
{
int
height
=
btn
->
height
();
int
width
=
btn
->
width
();
QPoint
btnMinPos
=
btn
->
pos
();
QPoint
btnMaxPos
=
btn
->
pos
();
btnMaxPos
.
setX
(
btn
->
pos
().
x
()+
width
);
btnMaxPos
.
setY
(
btn
->
pos
().
y
()+
height
);
if
(
pp
.
x
()
>=
btnMinPos
.
x
()
&&
pp
.
y
()
>=
btnMinPos
.
y
()
&&
pp
.
x
()
<=
btnMaxPos
.
x
()
&&
pp
.
y
()
<=
btnMaxPos
.
y
())
return
true
;
else
return
false
;
}
http://www.tonkv.com/blog/read.php?266#entrymore(原文地址)
“雁过留痕”的鼠标移动事件(续)
在 上面一篇文章中,我们介绍一种实际是通过鼠标当前坐标位置是否进入按钮坐标区域进行判断,这样实现起来多少有点麻烦。所以我们需要更方便简介的办法。很巧 合的是Qt为我们提供了这样的功能,那就事件过滤器【eventFilter()】。这是一个非常强大的功能。下面的例子中有九个按钮,当鼠标移动到每个按钮上时,该按钮就会发生你所指定的反应。这里例子仅仅只是显示标签文字而已,当然你们也可以进行更复杂的操作。
首先我们要做的就是为每个按钮注册监视对象【installEventFilter()】。
void MenuForm::init() { //为按钮注册事件 Qtbtn_1->installEventFilter(this); Qtbtn_2->installEventFilter(this); Qtbtn_3->installEventFilter(this); Qtbtn_4->installEventFilter(this); Qtbtn_5->installEventFilter(this); Qtbtn_6->installEventFilter(this); Qtbtn_7->installEventFilter(this); Qtbtn_8->installEventFilter(this); Qtbtn_9->installEventFilter(this); }
现在程序可以监视你注册后的对象了,然后我们要做的就是在监视对象的eventFiilter()函数中来处理目标对象事件。
bool MenuForm::eventFilter(QObject *target, QEvent *e) { if(target == Qtbtn_1) { if(e->type() == QEvent::Enter) Qlab_context->setText("这是第一个按钮"); } if(target == Qtbtn_2) { if(e->type() == QEvent::Enter) Qlab_context->setText("这是第二个按钮"); } if(target == Qtbtn_3) { if(e->type() == QEvent::Enter) Qlab_context->setText("这是第三个按钮"); } if(target == Qtbtn_4) { if(e->type() == QEvent::Enter) Qlab_context->setText("这是第四个按钮"); } if(target == Qtbtn_5) { if(e->type() == QEvent::Enter) Qlab_context->setText("这是第五个按钮"); } if(target == Qtbtn_6) { if(e->type() == QEvent::Enter) Qlab_context->setText("这是第六个按钮"); } if(target == Qtbtn_7) { if(e->type() == QEvent::Enter) Qlab_context->setText("这是第七个按钮"); } if(target == Qtbtn_8) { if(e->type() == QEvent::Enter) Qlab_context->setText("这是第八个按钮"); } if(target == Qtbtn_9) { if(e->type() == QEvent::Enter) Qlab_context->setText("这是第九个按钮"); } return QDialog::eventFilter(target, e); }
这样的功能完成了。
相关文章推荐
- Qt中mouseMoveEvent在MainWindow中使用
- QT基础学习笔记
- QT学习记录之控件布局
- QT学习记录之控件布局
- Qt:信号与槽(Signals and Slots) 下
- Qt:信号与槽(Signals and Slots) 上
- QT学习记录之理解信号槽机制
- QT学习记录之理解信号槽机制
- QTP学习-与ie相关
- Qt如何实现QTableView的撤消与恢复功能
- qt入门之qt移植arm上参数设置
- qt入门之窗口居中,没大小化按钮
- 【QTP专题】02_时间同步点问题
- QT实现文本编辑器
- Qt图片显示效率的比较
- 根据qt工程pro生成工程
- QT 对话框数据传递
- qt 事件机制
- Qt 将一个Widget(子)从某个Widget(父)中移除的方法
- ubuntu下qt连接sqlserver2008