为何在QGraphicsItem的鼠标处理函数中获取坐标不对?

nolatestudy 2011-03-29 05:51:02
我在QGraphicsItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)中获取当前鼠标的坐标,使用函数event->pos(),发现值很怪,是(0,1080205312)之类的值,而且x始终是0,y值则很大。按帮助说明,这获取的是item坐标系下的坐标,而我的item的大小为170*170,且设置了在scene中的位置,也在预期的位置显示出来了,就是获取不了正确的鼠标坐标。哪位达人帮忙分析下,是哪里出了问题?我已经看了一整天了,没头绪啊!
...全文
1517 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
renmenziji 2011-11-29
  • 打赏
  • 举报
回复
受教了。谢谢啊!
dbzhang800 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 nolatestudy 的回复:]

我奇怪的是,为什么非得做一次强制转换成int才能得到正确的值?
[/Quote]

说明你需要补充一下C、C++ 的基础知识,或者微机原理一类的。比如,最简单的例子:

#include <stdio.h>

int main ()
{
printf ("Two plus two is %f\n", 4);
return 0;
}


看出什么问题了没?
nolatestudy 2011-04-06
  • 打赏
  • 举报
回复
我奇怪的是,为什么非得做一次强制转换成int才能得到正确的值?
fibo_nacci 2011-04-02
  • 打赏
  • 举报
回复
试试QCursor::pos()。

void MyItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
void MyItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
上面两个函数处理里并没有处理位置,建议放到父类view里去做,
void MyGraphView::mousePressEvent(QMouseEvent *event);在这里用event->pos()是可以的。
lemonlinger 2011-04-01
  • 打赏
  • 举报
回复
试试 event->scenePos() 呢?

如果不行再 mapFromScene(event->scenePos())
nolatestudy 2011-04-01
  • 打赏
  • 举报
回复
qDebug("MyItem::mousePressEvent: %d-%d\n", event->pos().x(), event->pos().y());
改为
qDebug("MyItem::mousePressEvent: %d-%d\n", (int)event->pos().x(), (int)event->pos().y());

出来的结果就正确了,太诡异了吧!
qreal int两种数据类型相差那么远吗?
nolatestudy 2011-03-30
  • 打赏
  • 举报
回复
有人遇到类似情况吗?
我用contains(event->pos())可以检查当前鼠标位置是否在ITEM范围,但只做到这点不够,我需要一个准确的坐标点。
nolatestudy 2011-03-29
  • 打赏
  • 举报
回复
view类
MyGraphView::MyGraphView(QWidget *parent): QGraphicsView(parent)
{
QGraphicsScene *scene = new QGraphicsScene(this);
scene->setItemIndexMethod(QGraphicsScene::NoIndex);
scene->setSceneRect(0, 0, 800, 480);
setScene(scene);
setCacheMode(CacheBackground);
setViewportUpdateMode(BoundingRectViewportUpdate);
setRenderHint(QPainter::Antialiasing);
setTransformationAnchor(AnchorUnderMouse);

setFixedSize(800, 480);
setFrameShape(QFrame::NoFrame);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

setMouseTracking(true);
centerNode = new MyItem(this);
scene->addItem(centerNode);
centerNode->setPos(100, 100);
}

item类
MyItem::MyItem(MyGraphView *graphWidget)
: graph(graphWidget)
{
setFlag(ItemIsSelectable);
setFlag(ItemSendsGeometryChanges);
setCacheMode(DeviceCoordinateCache);
m_enStatus = enNormal;
}

void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *)
{
painter->drawEllipse(0, 0, 170, 180);
}
QRectF MyItem::boundingRect() const
{
return QRectF(0 , 0 , 170 , 180);
}
void MyItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
qDebug("MyItem::mousePressEvent: %d-%d\n", event->pos().x(), event->pos().y());
m_enStatus = enNormal;
update();
QGraphicsItem::mousePressEvent(event);
}

void MyItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
qDebug("MyItem::mouseReleaseEvent: %d-%d\n", event->pos().x(), event->pos().y());
m_enStatus = enNormal;
update();
QGraphicsItem::mouseReleaseEvent(event);
}

没几行代码,原想myItem模拟按钮。简化后就是以上代码,我测试发现同样获取坐标不对。

dbzhang800 2011-03-29
  • 打赏
  • 举报
回复
贴出你完整的测试代码看看呢?(保持程序完整的情况下尽可能精简,这个过程本身也有助于你发现并解决问题)

16,235

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧