Qt可编辑QGraphicsTextItem验证文本并在更改时发出信号

Abh*_*sal 4 validation qt signals qgraphicsview qgraphicstextitem

我真的很想完成与Qt GraphicsView相关的任务.任何帮助或建议将受到高度赞赏.在我的QGraphicsView应用程序中,我有一些可编辑的QGraphicsTextItems,我已添加到场景中.我需要以下功能:

  • 为float设置验证器,以便用户不会错误地在该文本项中输入字符或换行符.
  • 用户更改文本后发出信号.

任何人都可以建议我如何在我的应用程序中实现这一点?我尝试过很努力,但我找不到合适的东西.如果有任何替代或解决方法,我将很高兴知道.

谢谢!

cma*_*t85 7

QGraphicsTextItem不支持这种能力,因为我相信你已经发现了.所以你有几个选择:

  1. 重新实现focusOutEvent(QFocusEvent* event)和/或keyReleaseEvent(QKeyEvent* event)检测验证器何时需要运行.A QValidator可以创建为文本类的成员,并在焦点丢失和/或按下键时查询(输入键表示完成,或在每个字母上).然后在认为编辑完成或更改时为您创建自定义信号.
  2. 使用a GraphicsProxyWidget来保存QLineEdit文本输入的"真实" ,只需使用验证器进行设置,就像放置在传统的GUI表单中一样.您将需要"转发" editingFinished()textEdited(const QString& text)发送信号QLineEdit给您QGraphicsTextItem,因此您不必提供对窗口小部件的外部访问.
  3. 你也可以使用内部QTextDocumentQGraphicsTextItem,这是实际持有和格式化文本(访问它document()).但是它不支持QValidator安装,所以你必须创建一个信号槽循环,当文本被更改(发信号contentsChanged())时,它被接收QGraphicsTextItem,经过验证,然后如果验证失败则更新/清除(这将是更新QTextDocument,并再次触发此过程)或如果它通过则忽略.

两者都难以实施; 第一个需要更多代码,但可以让您更好地控制文本框的视觉外观.

  • [QTextDocument::contentsChanged()](http://qt-project.org/doc/qt-5.0/qtgui/qtextdocument.html#contentsChanged) 信号可以工作吗?您可以使用 [QGraphicsTextItem::document()](http://qt-project.org/doc/qt-5.0/qtwidgets/qgraphicstextitem.html#document) 获取 QTextDocument 对象。我只是在这里猜测。 (2认同)