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

时间:2013-06-13 04:59:39

标签: qt validation signals qgraphicsview qgraphicstextitem

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:7)

QGraphicsTextItem不支持此功能,因为我相信你已经发现了。所以你有几个选择:

  1. 重新实现focusOutEvent(QFocusEvent* event)和/或keyReleaseEvent(QKeyEvent* event)以检测验证程序何时需要运行。可以创建QValidator作为文本类的成员,并在焦点丢失和/或按下键时查询(输入键表示完成,或在每个字母上)。然后在认为编辑完成或更改时,为您创建自定义信号。
  2. 使用GraphicsProxyWidget来保存“真实”QLineEdit用于文本输入,只需使用验证器进行设置,就像放置传统的GUI表单一样。您需要将editingFinished()textEdited(const QString& text)信号从QLineEdit“转发”到您的QGraphicsTextItem,这样您就不必提供对小部件的外部访问权限。< / LI>
  3. 您还可以使用QTextDocument的内部QGraphicsTextItem,这是实际拥有并格式化文本(使用document()访问它)。但是,它不支持安装QValidator,因此您必须创建一个信号槽循环,以便在文本更改时(由contentsChanged()发出信号),QGraphicsTextItem收到它,验证,如果验证失败(更新QTextDocument,再次触发此过程),则更新/清除;如果通过,则忽略。
  4. 两者都难以实施;第一个需要更多代码,但可以让您更好地控制文本框的视觉外观。