如何将QLabel添加到QGraphicsItem中

5
我有一个QGraphicsItem,上面有文本。我希望这个文本是可编辑的,所以如果用户双击它,它将进入编辑模式。似乎最简单的方法是将文本更改为QLineEdit,并让用户在完成后点击离开焦点或按Enter键。
如何给QGraphicsItem添加QLineEdit?我已经对QGraphicsItem进行了子类化,因此可以访问其内部。
3个回答

11
要将任何基于 QWidget 的对象添加到 QGraphicsScene 中,需要使用 QGraphicsProxyWidget
当您在 QGraphicsScene 上调用 addWidget 函数时,它会将小部件嵌入到 QGraphicsProxyWidget 中,并将该 QGraphicsProxyWidget 返回给调用者。 QGraphicsProxyWidget 将事件转发到其小部件,并处理不同坐标系之间的转换。
现在,您正在考虑在 QGraphicsScene 中使用 QLineEdit,您需要决定是直接添加还是:
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添加为你的类的成员,并调用其相关函数,但将其作为子项添加可能更简单。


5
QGraphicsTextItem::setTextInteractionFlags (Qt::TextInteractionFlags flags)

您可以使用API,但是需要在其中创建QGraphicsTextItem

请查看以下链接获取详细信息:实现细节


@Freedom_Ben QLineEdit是一个QWidget,所以如果你想要QLineEdit而不是QGraphicsTextItem,那么最好采用"mhcuervo"已经回答过的不同方法。 - Ashif
这实际上是一个很好的答案,因为大多数人都忽略了这个功能。如果你想要简单性,更不用说整体性能,那么添加QWidgets和相关的代理项就是另一回事了,你可能不想涉及到这些复杂的问题。 - osirisgothra

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接