• 5551阅读
  • 1回复

[讨论]QWidget 保持原有行为, 且被添加到 QGraphicsScene,  同时可以在按住Ctrl时 进行移动 [复制链接]

上一主题 下一主题
离线liuxu_lx7
 
只看楼主 倒序阅读 楼主  发表于: 2012-09-29
写了一个 【QWidget 保持原有行为, 且被添加到 QGraphicsScene,  同时可以在按住Ctrl时 进行移动】 的代码。
试验成功,但不知是否存在【某种隐患】,忘有经验的朋友,指正下~~
  1. class XGraphicsProxyWidget : public QGraphicsProxyWidget
  2. {
  3. public:
  4.     XGraphicsProxyWidget (QGraphicsItem* parent = 0, Qt::WindowFlags wFlags = 0);
  5.     void                                            SetGraphicsMode(GraphicsItemFlags);
  6. protected:
  7.     void                                            mousePressEvent(QGraphicsSceneMouseEvent*);
  8.     void                                            mouseReleaseEvent(QGraphicsSceneMouseEvent*);
  9.     void                                            mouseMoveEvent(QGraphicsSceneMouseEvent*);
  10. private:
  11.     void                                            StartGraphicsMode();
  12.     void                                            StopGraphicsMode();
  13.     bool                                            IsGraphicsMode() const;
  14. private:
  15.     GraphicsItemFlags                        m_eWidgetFlag;
  16.     GraphicsItemFlags                        m_eGraphicsFlag;
  17. };
  18. XGraphicsProxyWidget::XGraphicsProxyWidget( QGraphicsItem * parent /* = 0 */, Qt::WindowFlags wFlags /* = 0 */ ) :
  19.     QGraphicsProxyWidget(parent, wFlags),
  20.     m_eWidgetFlag(flags()),
  21.     m_eGraphicsFlag(0)
  22. {
  23. }
  24. void XGraphicsProxyWidget::SetGraphicsMode(GraphicsItemFlags flags)
  25. {
  26.     m_eGraphicsFlag = flags;
  27. }
  28. void XGraphicsProxyWidget::StartGraphicsMode()
  29. {
  30.     m_eWidgetFlag = flags(); // save
  31.     setFlags(m_eGraphicsFlag);
  32. }
  33. void XGraphicsProxyWidget::StopGraphicsMode()
  34. {
  35.     setFlags(m_eWidgetFlag);
  36. }
  37. bool XGraphicsProxyWidget::IsGraphicsMode() const
  38. {
  39.     return flags() == m_eGraphicsFlag;
  40. }
  41. void XGraphicsProxyWidget::mousePressEvent(QGraphicsSceneMouseEvent *event)
  42. {
  43.     if (event->type() == QEvent::GraphicsSceneMousePress
  44.         && (event->modifiers() & Qt::ControlModifier))
  45.     {
  46.         StartGraphicsMode();
  47.         
  48.         QGraphicsItem::mousePressEvent(event);
  49.     }
  50.     else
  51.     {
  52.         QGraphicsProxyWidget::mousePressEvent(event);
  53.     }
  54. }
  55. void XGraphicsProxyWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
  56. {
  57.     if (IsGraphicsMode())
  58.     {
  59.         StopGraphicsMode();
  60.         QGraphicsItem::mouseReleaseEvent(event);
  61.     }
  62.     else
  63.     {
  64.         QGraphicsProxyWidget::mouseReleaseEvent(event);
  65.     }
  66. }
  67. void XGraphicsProxyWidget::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
  68. {
  69.     if (IsGraphicsMode())
  70.         QGraphicsItem::mouseMoveEvent(event);
  71.     else
  72.         QGraphicsProxyWidget::mouseMoveEvent(event);
  73. }
测试代码:
  1. m_pScene = new QGraphicsScene;
  2.     m_pView = new QGraphicsView(m_pScene, this);
  3.     //m_pView->resize(800, 600);
  4.     setCentralWidget(m_pView);
  5.     QLineEdit* pb = new QLineEdit("text");
  6.     XGraphicsProxyWidget *proxy = new XGraphicsProxyWidget;
  7.     proxy->setWidget(pb);
  8.     proxy->SetGraphicsMode(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
  9.     m_pScene->addItem(proxy);
  10.     m_pView->show();
因为先点击控件, 后按 ctrl , QWidget状态会有错误(以QPushButton为例),因此只能做成【必须先按ctrl,再点击QGraphicItem才能移动】。不知道是否有更好的方法可以解决这种现象~~


离线ansly20060

只看该作者 1楼 发表于: 2012-12-12
如何保存场景啊
快速回复
限100 字节
 
上一个 下一个