4

I have a QGraphicsItem that has text on it. I want this text to be editable, so that if the user double-clicks it, it will enter an edit mode. It seems like the easiest way to do this would be to change the text into a QLineEdit and let the user click away the focus or press enter when they're done.

How can I add a QLineEdit to a QGraphicsItem? I have subclassed the QGraphicsItem so I have access to its internals.

4

3 回答 3

10

要将任何QWidget基于对象添加到 a QGraphicsScene, aQGraphicsProxyWidget是必需的。

当您调用 on 函数addWidgetQGraphicsScene,它会将小部件嵌入到 a 中QGraphicsProxyWidget并将其QGraphicsProxyWidget返回给调用者。

QGraphicsProxyWidget事件转发到它的小部件并处理不同坐标系之间的转换。

现在您正在考虑在 中使用 a QLineEditQGraphicsScene您需要决定是否要直接添加它:

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为类的成员并调用其相关函数,但将其添加为子类可能要简单得多。

于 2013-08-15T07:53:52.883 回答
5
QGraphicsTextItem::setTextInteractionFlags (Qt::TextInteractionFlags flags)

可以使用 API。但是你需要在QGraphicsTextItem里面创建。

详情请查看以下链接:实施细节

于 2013-08-15T03:16:57.257 回答
2

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

于 2013-08-15T02:02:19.793 回答