试验成功,但不知是否存在【某种隐患】,忘有经验的朋友,指正下~~
class XGraphicsProxyWidget : public QGraphicsProxyWidget
{
public:
XGraphicsProxyWidget (QGraphicsItem* parent = 0, Qt::WindowFlags wFlags = 0);
void SetGraphicsMode(GraphicsItemFlags);
protected:
void mousePressEvent(QGraphicsSceneMouseEvent*);
void mouseReleaseEvent(QGraphicsSceneMouseEvent*);
void mouseMoveEvent(QGraphicsSceneMouseEvent*);
private:
void StartGraphicsMode();
void StopGraphicsMode();
bool IsGraphicsMode() const;
private:
GraphicsItemFlags m_eWidgetFlag;
GraphicsItemFlags m_eGraphicsFlag;
};
XGraphicsProxyWidget::XGraphicsProxyWidget( QGraphicsItem * parent /* = 0 */, Qt::WindowFlags wFlags /* = 0 */ ) :
QGraphicsProxyWidget(parent, wFlags),
m_eWidgetFlag(flags()),
m_eGraphicsFlag(0)
{
}
void XGraphicsProxyWidget::SetGraphicsMode(GraphicsItemFlags flags)
{
m_eGraphicsFlag = flags;
}
void XGraphicsProxyWidget::StartGraphicsMode()
{
m_eWidgetFlag = flags(); // save
setFlags(m_eGraphicsFlag);
}
void XGraphicsProxyWidget::StopGraphicsMode()
{
setFlags(m_eWidgetFlag);
}
bool XGraphicsProxyWidget::IsGraphicsMode() const
{
return flags() == m_eGraphicsFlag;
}
void XGraphicsProxyWidget::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
if (event->type() == QEvent::GraphicsSceneMousePress
&& (event->modifiers() & Qt::ControlModifier))
{
StartGraphicsMode();
QGraphicsItem::mousePressEvent(event);
}
else
{
QGraphicsProxyWidget::mousePressEvent(event);
}
}
void XGraphicsProxyWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
if (IsGraphicsMode())
{
StopGraphicsMode();
QGraphicsItem::mouseReleaseEvent(event);
}
else
{
QGraphicsProxyWidget::mouseReleaseEvent(event);
}
}
void XGraphicsProxyWidget::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
if (IsGraphicsMode())
QGraphicsItem::mouseMoveEvent(event);
else
QGraphicsProxyWidget::mouseMoveEvent(event);
}
测试代码:
m_pScene = new QGraphicsScene;
m_pView = new QGraphicsView(m_pScene, this);
//m_pView->resize(800, 600);
setCentralWidget(m_pView);
QLineEdit* pb = new QLineEdit("text");
XGraphicsProxyWidget *proxy = new XGraphicsProxyWidget;
proxy->setWidget(pb);
proxy->SetGraphicsMode(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
m_pScene->addItem(proxy);
m_pView->show();
因为先点击控件, 后按 ctrl , QWidget状态会有错误(以QPushButton为例),因此只能做成【必须先按ctrl,再点击QGraphicItem才能移动】。不知道是否有更好的方法可以解决这种现象~~