• 7992阅读
  • 3回复

自定义的QGraphicsItem为何不能选择移动? [复制链接]

上一主题 下一主题
离线omss
 

只看楼主 倒序阅读 楼主  发表于: 2011-04-04
自定义的moduleitem继承自QGraphicsPolygonItem,
是一个圆角矩形内加一个字符串,实现的代码如下,
编译后可以运行,也能显示出来,但却不能选择拖拽移动,
同时放到scene里的textitem("Hello"),选择移动都没有问题
问题出在哪里?还需要实现什么函数吗?

  1. #include
  2. #include
  3. #include "moduleitem.h"
  4. moduleitem::moduleitem(QWidget *parent, char *str)
  5. {
  6.         sprintf(mname,"%s\0",str);
  7. }
  8. void moduleitem::paint(QPainter *painter,
  9.                           const QStyleOptionGraphicsItem *option,
  10.                           QWidget *widget)
  11. {
  12.     QRectF *qrect= new QRectF(-25,-25,50,50);
  13.     painter->drawRoundedRect(*qrect, 5, 5);
  14.     painter->drawText(*qrect, Qt::AlignCenter,QString(mname));
  15. }
  16. QRectF moduleitem::boundingRect()
  17. {
  18.     QRectF *qrect= new QRectF(-25,-25,50,50);
  19.         return *qrect;
  20. }


  1. #include "stt3.h"
  2. #include "ui_stt3.h"
  3. #include "moduleitem.h"
  4. #include
  5. #include
  6. #include
  7. #include
  8. stt3::stt3(QWidget *parent) :
  9.     QMainWindow(parent),
  10.     ui(new Ui::stt3)
  11. {
  12.     ui->setupUi(this);
  13.     QGraphicsScene *scene=new QGraphicsScene;
  14. //text item
  15.     QGraphicsTextItem *titm= new QGraphicsTextItem(QString("Hello"));
  16.     titm->setFlag(QGraphicsItem::ItemIsSelectable);
  17.     titm->setFlag(QGraphicsItem::ItemIsMovable);
  18.     scene->addItem(titm);
  19. //module item
  20.     moduleitem *mitm= new moduleitem(ui->graphicsView,"testm");
  21.     mitm->setFlag(QGraphicsItem::ItemIsSelectable);
  22.     mitm->setFlag(QGraphicsItem::ItemIsMovable);
  23.     scene->addItem(mitm);
  24.     ui->graphicsView->setScene(scene);
  25.     ui->graphicsView->show();
  26. }


离线tlcugb

只看该作者 1楼 发表于: 2011-04-04
需要设置属性可移动!
离线sbtree
只看该作者 2楼 发表于: 2011-04-05
你的item的继承方式的实现函数不完整,要想移动shape()函数也要重写。
其实你既然从QGraphicsPolygonItem继承,就不用考虑那么多了,QGraphicsPolygonItem把需要实现的所有虚拟函数都已经实现了,你只要在你的构造函数里加一句setPolygon(QRectF(-25,-25,50,50));然后在paint函数里先调用QGraphicsPolygonItem::paint(painter,option,widget);接着加入画文本的代码 就够了,其他代码都是多余的而且是碍事的。
windows 7 + VC++2008 + Qt4.5.2
离线omss

只看该作者 3楼 发表于: 2011-04-05
多谢楼上,
在构造函数中加上setPolygon(QRectF(-25,-25,50,50),就可以了!

快速回复
限100 字节
 
上一个 下一个