QWidget 保持原有行为, 且被添加到 QGraphicsScene, 同时可以在按住Ctrl时 进行移动

写了一个 【QWidget 保持原有行为, 且被添加到 QGraphicsScene,  同时可以在按住Ctrl时 进行移动】 的代码。

试验成功,但不知是否存在【某种隐患】,忘有经验的朋友,指正下~~

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才能移动】。不知道是否有更好的方法可以解决这种现象~~


展开阅读全文

没有更多推荐了,返回首页