找回密码
 立即注册
收起左侧

QGraphicsItem旋转为什么不以自己的item坐标原点旋转?

14
回复
13833
查看
[复制链接]
累计签到:22 天
连续签到:1 天
来源: 2015-1-25 20:09:19 显示全部楼层 |阅读模式
2Qter豆
  1. #include "myitem.h"
  2. #include<QtGui>

  3. MyItem::MyItem()
  4. {
  5.     setFlags(ItemIsFocusable|ItemIsMovable);
  6.     boundingRect();
  7.     rect.setRect(-18,-18,36,36);
  8. }
  9. QRectF MyItem::boundingRect() const
  10. {
  11.     return QRectF(rect);
  12. }

  13. void MyItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
  14. {
  15.     prepareGeometryChange();
  16.     rect.moveCenter(event->pos()-offset);
  17.     update();
  18. }
  19. void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
  20. {
  21.     painter->drawRect(rect);
  22. }
  23. void MyItem::keyPressEvent(QKeyEvent *event)
  24. {
  25.     switch (event->key())
  26.     {
  27.     case Qt::Key_4 :
  28.         rotate(-30);
  29.         break;
  30.     case Qt::Key_6 :
  31.         rotate(30);
  32.         break;
  33.     case Qt::Key_Up:
  34.         scale(1.2,1.2);
  35.         break;
  36.     case Qt::Key_Down:
  37.         scale(1/1.2,1/1.2);
  38.         break;
  39.     }
  40. }
  41. void MyItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
  42. {
  43.     setFocus();
  44.     offset=event->pos()-rect.center();
  45. }
复制代码
不加MouseMoveEvent拖动item然后放大缩小旋转都是以图形项坐标原点变化的,为什么我这么一改就只能按item初始位置的坐标点变化了?
item.setPos(x,y); 就按(x,y)点旋转、缩放,如果没设置就是场景坐标的(0,0)点。我的boundingRect也跟着改变了位置,为什么不是按着图形项坐标原点变化?

最佳答案

查看完整内容

void MyItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { QGraphicsItem::mouseMoveEvent(event); } 这样就可以了。
回复

使用道具 举报

累计签到:1603 天
连续签到:1 天
2015-1-25 20:09:20 显示全部楼层
syaowen 发表于 2015-1-28 15:21
请问“不要设置rect的位置”是什么意思?
是不要设置图形项item的位置么?我没有设置item的位置的时候, ...

void MyItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    QGraphicsItem::mouseMoveEvent(event);
}

这样就可以了。
回复

使用道具 举报

累计签到:22 天
连续签到:1 天
2015-1-26 10:00:40 显示全部楼层
@yafeilinux  老师麻烦帮忙看一下好么
回复

使用道具 举报

累计签到:1603 天
连续签到:1 天
2015-1-26 10:38:27 显示全部楼层
把源码发一下。
回复

使用道具 举报

累计签到:22 天
连续签到:1 天
2015-1-26 10:48:33 显示全部楼层
main.cpp
  1. #include<QApplication>
  2. #include<QtGui>
  3. #include"myitem.h"

  4. int main(int argc,char *argv[])
  5. {
  6.     QApplication app(argc,argv);
  7.     QGraphicsScene scene;
  8.     scene.setSceneRect(-200, -150, 400, 300);

  9.     MyItem *item = new MyItem;
  10.     scene.addItem(item);
  11.     item->setPos(50,50);

  12.     QGraphicsView view;
  13.     view.setScene(&scene);
  14.     view.show();

  15.     return app.exec();
  16. }
复制代码
myitem.cpp
  1. #include "myitem.h"
  2. #include<QtGui>

  3. MyItem::MyItem()
  4. {
  5.     setFlags(ItemIsFocusable|ItemIsMovable);
  6.     boundingRect();
  7.     rect.setRect(-18,-18,36,36);
  8. }
  9. QRectF MyItem::boundingRect() const
  10. {
  11.     return QRectF(rect);
  12. }

  13. void MyItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
  14. {
  15.     prepareGeometryChange();
  16.     rect.moveCenter(event->pos()-offset);
  17.     update();
  18. }
  19. void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
  20. {
  21.     painter->drawRect(rect);
  22. }
  23. void MyItem::keyPressEvent(QKeyEvent *event)
  24. {
  25.     switch (event->key())
  26.     {
  27.     case Qt::Key_4 :
  28.         rotate(-30);
  29.         break;
  30.     case Qt::Key_6 :
  31.         rotate(30);
  32.         break;
  33.     case Qt::Key_Up:
  34.         scale(1.2,1.2);
  35.         break;
  36.     case Qt::Key_Down:
  37.         scale(1/1.2,1/1.2);
  38.         break;
  39.     }
  40. }
  41. void MyItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
  42. {
  43.     setFocus();
  44.     offset=event->pos()-rect.center();
  45. }
复制代码
回复

使用道具 举报

累计签到:22 天
连续签到:1 天
2015-1-26 10:49:23 显示全部楼层
yafeilinux 发表于 2015-1-26 10:38
把源码发一下。

myitem.h
  1. #ifndef MYITEM_H
  2. #define MYITEM_H

  3. #include <QGraphicsItem>

  4. class MyItem : public QGraphicsItem
  5. {
  6. public:
  7.     MyItem();
  8.     void keyPressEvent(QKeyEvent *event);
  9.     void mousePressEvent(QGraphicsSceneMouseEvent *event);
  10.     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
  11.     QRectF boundingRect() const;
  12.     void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
  13. private:
  14.     QRectF rect;
  15.     QPointF startPoint;
  16.     QPointF offset;

  17. };

  18. #endif // MYITEM_H
复制代码
回复

使用道具 举报

累计签到:1603 天
连续签到:1 天
2015-1-26 23:09:27 显示全部楼层
syaowen 发表于 2015-1-26 10:48
main.cppmyitem.cpp

我的意思是打包发一下,我测试下。
回复

使用道具 举报

累计签到:22 天
连续签到:1 天
2015-1-27 09:18:55 显示全部楼层
yafeilinux 发表于 2015-1-26 23:09
我的意思是打包发一下,我测试下。

已添加到附件,麻烦您了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

累计签到:1603 天
连续签到:1 天
2015-1-27 20:57:12 显示全部楼层
既然已经设置了setFlags(ItemIsFocusable|ItemIsMovable);那么Item就是可以拖动的,不需要自己设置mouseMoveEvent。

MyItem::MyItem()
{
    setFlags(ItemIsFocusable|ItemIsMovable);
    rect.setRect(-18,-18,36,36);
}
QRectF MyItem::boundingRect() const
{
    return QRectF(rect);
}

void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->drawRect(rect);
}
void MyItem::keyPressEvent(QKeyEvent *event)
{
    switch (event->key())
    {
    case Qt::Key_4 :
        rotate(-30);
        break;
    case Qt::Key_6 :
        rotate(30);
        break;
    case Qt::Key_Up:
        scale(1.2,1.2);
        break;
    case Qt::Key_Down:
        scale(1/1.2,1/1.2);
        break;
    }
}

void MyItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    setFocus();
}
回复

使用道具 举报

累计签到:22 天
连续签到:1 天
2015-1-27 21:17:22 显示全部楼层
yafeilinux 发表于 2015-1-27 20:57
既然已经设置了setFlags(ItemIsFocusable|ItemIsMovable);那么Item就是可以拖动的,不需要自己设置mouseMov ...

哦,这个我是知道的,如果不设置MouseMoveEvent()是可以的,但是这只是我的测试程序,我怕源程序看起来稍复杂所以写了个简单的,还要实现的功能包括改变item内画的rect的四个边的拉伸,所以必须要重新写MouseMoveEvent。
回复

使用道具 举报

累计签到:22 天
连续签到:1 天
2015-1-28 09:24:17 显示全部楼层
yafeilinux 发表于 2015-1-27 20:57
既然已经设置了setFlags(ItemIsFocusable|ItemIsMovable);那么Item就是可以拖动的,不需要自己设置mouseMov ...

如果一定要用mouseMoveEvent函数怎么办呢,这样出现问题的原因是什么?
回复

使用道具 举报

累计签到:1603 天
连续签到:1 天
2015-1-28 11:39:02 显示全部楼层
syaowen 发表于 2015-1-28 09:24
如果一定要用mouseMoveEvent函数怎么办呢,这样出现问题的原因是什么?

不要设置rect的位置。

可以再研究下坐标系统!
回复

使用道具 举报

累计签到:22 天
连续签到:1 天
2015-1-28 15:21:46 显示全部楼层
yafeilinux 发表于 2015-1-28 11:39
不要设置rect的位置。

可以再研究下坐标系统!

请问“不要设置rect的位置”是什么意思?
是不要设置图形项item的位置么?我没有设置item的位置的时候,就默认在(0,0)点,无论item移动到哪里都是绕(0,0)点转动,如果item.setPos(X,Y),并且在paint函数中加上drawRect(boundingRect)可以看出图形项实际上已经并不在(X,Y)点了,但item仍就绕着(X,Y)点转动。这是我一直不明白为什么的。

如果说是不要在构造函数中设置rect的位置,那怎么画?
回复

使用道具 举报

累计签到:22 天
连续签到:1 天
2015-1-28 22:39:50 显示全部楼层
yafeilinux 发表于 2015-1-28 20:23
void MyItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    QGraphicsItem::mouseMoveEvent(e ...

问题确实解决了,但想知道为什么会这样。
回复

使用道具 举报

累计签到:1603 天
连续签到:1 天
2015-1-29 10:48:29 显示全部楼层
syaowen 发表于 2015-1-28 22:39
问题确实解决了,但想知道为什么会这样。

需要执行默认的鼠标移动事件,这样才能按照Qt设置好的行为拖放item。

点评

谢谢,麻烦老师您了。  发表于 2015-1-29 14:02
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了