如何将QLabel添加到QGraphicsItem

时间:2013-08-15 01:45:00

标签: c++ qt qt4 qgraphicsview qgraphicsitem

我有一个QGraphicsItem,上面有文字。我希望此文本可编辑,因此如果用户双击它,它将进入编辑模式。似乎最简单的方法是将文本更改为QLineEdit,让用户点击焦点或在完成后按Enter键。

如何向QLineEdit添加QGraphicsItem?我已将QGraphicsItem子类化,因此我可以访问其内部。

3 个答案:

答案 0 :(得分:8)

要将任何基于QWidget的对象添加到QGraphicsScene,需要QGraphicsProxyWidget

当您在addWidget上调用函数QGraphicsScene时,它会将小部件嵌入QGraphicsProxyWidget并将QGraphicsProxyWidget返回给调用方。

QGraphicsProxyWidget将事件转发到其窗口小部件,并处理不同坐标系之间的转换。

现在您正在考虑使用QLineEdit中的QGraphicsScene,您需要决定是否要直接添加它:

QGraphicsScene* pScene = new QGraphicsScene;
QLineEdit* pLineEdit = new QLineEdit("Some Text");

// add the widget - internally, the QGraphicsProxyWidget is created and returned
QGraphicsProxyWidget* pProxyWidget = pScene->AddWidget(pLineEdit);

或者只是将其添加到您当前的QGraphicsItem。 在这里,您可以将其添加为QGraphicsItem的孩子:

MyQGraphicsItem* pMyItem = new MyQGraphicsItem;
QGraphicsProxyWidget* pMyProxy = new QGraphicsProxyWidget(pMyItem); // the proxy's parent is pMyItem
pMyProxy->setWidget(pLineEdit); // adding the QWidget based object to the proxy

或者您可以将QGraphicsProxyWidget添加为您的班级成员并调用其相关功能,但将其添加为孩子可能会更简单。

答案 1 :(得分:5)

QGraphicsTextItem::setTextInteractionFlags (Qt::TextInteractionFlags flags)

可以使用API​​。但是你需要在其中创建QGraphicsTextItem

请查看以下链接了解详情:Implementation details

答案 2 :(得分:2)

如果您需要某些特定行为或仅使用QGraphicsProxyWidget,则需要通过扩展QGraphicsProxyWidget来创建代理窗口小部件。查看Qt SDK中的“嵌入式对话框”示例和QGraphicsProxyWidget文档。它已经存在了很长时间,所以它应该是你的版本。我希望这会有所帮助。