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

4
我遇到了一个关于Qt GraphicsView的任务,需要您的帮助和建议。在我的QGraphicsView应用程序中,我添加了一些可编辑的QGraphicsTextItems到场景中。我需要以下功能:
  • 为浮点数设置验证器,以防用户错误地在文本项中输入字符或换行符。
  • 当用户更改文本时发出信号。
请问有人可以建议我如何在我的应用程序中实现这个功能吗?我已经尝试了很多努力,但是我找不到合适的东西。如果有任何替代方案或解决方法,我将不胜感激。
谢谢!
1个回答

8

QGraphicsTextItem不支持此功能,您肯定已经发现了。因此,您有几个选项:

  1. 重新实现 focusOutEvent(QFocusEvent* event)和/或keyReleaseEvent(QKeyEvent* event)以检测何时需要运行验证器。可以在文本类的成员中创建一个QValidator,并在失去焦点和/或按键(输入完成时的回车键或每个字母)时进行查询。然后只需在编辑完成或更改时为您创建自定义信号。
  2. 使用GraphicsProxyWidget来保存用于文本输入的“真正的”QLineEdit,只需像放置在传统GUI表单中一样设置它的验证程序即可。您需要将editingFinished()textEdited(const QString& text)信号从QLineEdit“转发”到您的QGraphicsTextItem,以便无需提供对该小部件的外部访问。
  3. 您还可以使用QGraphicsTextItem的内部QTextDocument,这实际上保存和格式化文本(使用document()访问)。但是,它不支持安装QValidator,因此您必须创建一个信号-槽循环,当文本改变时(通过contentsChanged()发出信号),它将被QGraphicsTextItem接收,进行验证,然后如果未通过验证,则更新/清除(这将更新QTextDocument并再次触发此过程)或者如果通过则忽略。

两种方法都不难实现;第一种需要更多的代码,但可以更好地控制文本框的外观。


2
QTextDocument::contentsChanged()信号能够工作吗?您可以使用QGraphicsTextItem::document()获取QTextDocument对象。这只是我的猜测。 - thuga
@thuga 不错的想法,它肯定不比其他方法更复杂。我已经进行了编辑。 - cmannett85
谢谢大家!非常有帮助的建议。 - Abhishek Bansal
谢谢,同志,就这样!// Спасибо, товарищ! ^_^ - Felix
谢谢,我也遇到了同样的问题... 关于选项1的问题: 使用QValidator的优点是什么?为什么不能在keyReleasedEvent中进行验证? - so.very.tired

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