qt中怎么使用qt 多个定时器器让一个点缓慢移动到鼠标点击位置

代码-qt中鼠标点击view获取点并将坐标转换为scene坐标之后在坐标处绘制item,位置发生偏移
作者:用户
浏览:1300 次
qt中鼠标点击view获取点并将坐标转换为scene坐标之后在坐标处绘制item,位置发生偏移如题,我的组件是用QGraphicsItem绘制的,重载了QMouseEvent,但是点击时在view上显
qt中鼠标点击view获取点并将坐标转换为scene坐标之后在坐标处绘制item,位置发生偏移
如题,我的组件是用QGraphicsItem绘制的,重载了QMouseEvent,但是点击时在view上显示的地方不对,主要代码如下:
QPoint viewPos = event-&pos();//获取视口坐标
QPointF scenePos = view_1-&mapToScene(viewPos);//将视口坐标转换为场景坐标
select-&setRect(scenePos.x(), scenePos.y(), 50, 50);//绘制圆圈
如图,鼠标点击位置与圆圈位置的偏移(当前我点击的是6那个点):
哪位大侠帮帮小弟一下,感激不尽!
已解决,是因为多层layout布局的原因,layout布局会有个margin,默认为11px。
希望对其他人有用。
解决方案二:
是我的问题太抽象了么?怎么没人回答啊,新手求救~~~
解决方案三:
是我的问题太抽象了么?怎么没人回答啊,新手求救~~~
【云栖快讯】新手小白必看!编程语言系列讲座火爆进行中,与行业资深专家一起学习Python、C++、JavaScript、Java!从入门到进阶&&
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
40+云计算产品,6个月免费体验
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
云服务器9.9元/月,大学必备博主最新文章
博主热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Qt 中如何给一个制定的按钮设置鼠标按下和抬起事件
[问题点数:40分,结帖人xiaofeng6552538]
Qt 中如何给一个制定的按钮设置鼠标按下和抬起事件
[问题点数:40分,结帖人xiaofeng6552538]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2011年10月 移动平台大版内专家分月排行榜第三2010年11月 移动平台大版内专家分月排行榜第三
匿名用户不能发表回复!|博客访问: 946163
博文数量: 178
博客积分: 3640
博客等级: 中校
技术积分: 1768
注册时间:
分类: LINUX 16:42:55
在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器;一种是使用QTimer类。定时器的精确性依赖于操作系统和硬件,大多数平台支持20ms的精确度。
■、QObject类的定时器
QObject是所有Qt对象的基类,它提供了一个基本的定时器。通过QObject::startTimer(),可以把一个一毫秒为单位的时间间隔作为参数来开始定时器,这个函数返回一个唯一的整数定时器的标识符。这个定时器开始就会在每一个时间间隔"触发",直到明确的使用这个定时器的标识符来调用QObject::killTimer()结束。
当定时器触发时,应用程序会发送一个QTimerEvent。在事件循环中,处理器按照事件队列的顺序来处理定时器事件。当处理器正忙于其它事件处理时,定时器就不能立即处理。
QObject类还提供定时期的功能。与定时器相关的成员函数有:startTimer()、timeEvent()、killTimer()。
QObject基类中的startTimer()和timerEvent()原型及说明如下:
int QObject::startTimer(int
interval);
开始一个定时器并返回定时器ID,如果不能开始一个定时器,将返回0。定时器开始后,每隔interval毫秒间隔将触发一次超时事件,直到killTimer()被调用来删除定时器。如果interval为0,那么定时器事件每次发生时没有窗口系统事件处理。
virtual void QObject::timerEvent(QTimerEvent
虚函数timerEvent()被重载来实现用户的超时事件处理函数。如果有多个定时器在运行,QTimerEvent::timerId()被用来查找指定定时器,对其进行操作。
当定时器事件发生时,虚函数timerEvent()随着QTimerEvent事件参数类一起被调用,重载这个函数可以获得定时器事件。
定时器的用法如下:
//头文件class QNewObject : public
Q_OBJECTpublic:
QNewObject( QObject * parent = 0
virtual ~QNewObject();
protected:
void timerEvent( QTimerEvent
int m_nTimerId;};
//源文件QNewObject::QNewObject( QObject *
:QNewObject( parent ){
m_nTimerId =
startTimer(1000);}
QNewObject::~QNewObject(){
m_nTimerId != 0 )
killTimer(m_nTimerId);}
void QNewObject::timerEvent( QTimerEvent *event
qDebug( "timer event, id %d", event->timerId()
■、定时器类QTimer
定时器类QTimer提供当定时器触发的时候发射一个信号的定时器,他提供只触发一次的超时事件,通常的使用方法如下:
//创建定时器QTimer *testTimer = new
QTimer(this);//将定时器超时信号与槽(功能函数)联系起来connect( testTimer,
SIGNAL(timeout()), this, SLOT(testFunction())
);//开始运行定时器,定时时间间隔为1000mstestTimer->start(1000);...//停止运行定时器if
( testTimer->isActive() )
testTimer->stop();
QTimer还提供了一个简单的只有一次定时的函数singleShot()。
一个定时器在100ms后触发处理函数animateTimeout()并且只触发一次。代码如下:
QTimer::singleShot( 100, this,
SLOT(animateTimeout()) );
第二种介绍:
定时器的使用非常简单,我们只需要以下几个步骤就可以完成定时器的应用:1.产生一个定时器QTimer
*time_clock=new
QTimer(parent);2.连接这个定时器的信号和槽,利用定时器的timeout()connect(time_clock,SIGNAL(timeout()),this,SLOT(slottimedone()));即定时时间到就会发送timeout()信号,从而触发slottimedone()槽去完成某项事情3.开始定时器,并设定定时周期定时器定时有两种:start(int
time)和setSingleShot(true)其中start(int
time)是表示每隔time秒就会重启定时器,可以重复触发定时,除非你利用stop()将定时器关掉。而setSingleShot(true)则是仅仅启动定时器一次我们工程中常用的是前者。time_clock->start(2000);备注:我在中文的官网上找到的关于定时器的用法是如下的使用格式:QTimer
*timer = new QTimer( myObject );connect( timer, SIGNAL(timeout()), myObject,
SLOT(timerDone()) );timer->start( 2000, TRUE ); //
2秒单触发定时器关于最后一句,timer->start( 2000, TRUE
);在我实际应用中,加上TRUE编译器就会报错,不知道为什么,去掉就没有关系了。这个问题遗留下来,或许以后可以解决掉
阅读(34579) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
请登录后评论。21:48 提问
QT定时器应该怎样使用呢?
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer-&start(1000);
这里必须要有this吗,SLOT的函数能不能不属于某个类呢?
我想在3秒后MainWindow的w关闭并显示另一个窗口(w2.show()),但是不知道怎样写,上面是官方文档的一段代码
按赞数排序
你构造定时器的时候就把对应类的指针传给QTimer,ranhslot中设置函数,定时器到了就触发你对应类的函数。
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐}

我要回帖

更多关于 qt定时器使用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信