我真的卡住与Qt GraphicsView任务。任何帮助或建议将非常感谢。在我的QGraphicsView应用程序中,我有一些可编辑的qgraphicstextitem,我已经添加到场景中。我需要以下功能:
- 设置float的验证器,这样用户就不会错误地在文本项中输入一个字符或新行。
- 当用户修改文本时发出信号。
谁能建议我如何在我的应用程序中实现这一点?我已经很努力了,但还是找不到合适的工作。如果有任何替代方案或变通办法,我将不胜感激。
谢谢!
QGraphicsTextItem
不支持这种能力,我相信您已经发现了。所以你有几个选项:
- 重新实现
focusOutEvent(QFocusEvent* event)
和/或keyReleaseEvent(QKeyEvent* event)
来检测验证器何时需要运行。可以将QValidator
创建为文本类的成员,并在焦点丢失和/或按下键(表示完成的回车键或每个字母)时进行查询。然后,当认为编辑已经完成或更改时,为您创建一个自定义信号。 - 使用
GraphicsProxyWidget
来保持文本输入的"真实"QLineEdit
,只需将其设置为验证器,就像您将其放置在传统GUI表单中一样。您需要将editingFinished()
或textEdited(const QString& text)
信号从QLineEdit
"转发"到QGraphicsTextItem
,因此您不必提供对小部件的外部访问。 - 您也可以使用
QGraphicsTextItem
的内部QTextDocument
,这是实际保存和格式化文本的内容(使用document()
访问它)。然而,它不支持安装QValidator
,所以你必须创建一个信号槽循环,即当文本被改变(由contentsChanged()
发出信号)时,它被QGraphicsTextItem
接收,验证,然后更新/清除,如果验证失败(这将更新QTextDocument
,并再次触发此过程)或忽略,如果它通过。
两者都不难实现;第一种方法需要更多的代码,但是可以让您更好地控制文本框的视觉外观。