QGraphicsTextItem
不支持此功能,因爲我相信你已經發現。所以,你有幾種選擇:
- 重新實現
focusOutEvent(QFocusEvent* event)
和/或當你驗證需要運行檢測。一個QValidator
可以爲你的文字類的成員創建,並詢問或者丟失焦點時和/或按下某個鍵(回車鍵表示完成,或在每一個字母)。然後,只要在編輯完成或更改時爲您創建自定義信號。
- 使用
GraphicsProxyWidget
來保存文本輸入的'真實'QLineEdit
,只需使用驗證器進行設置即可,就像置入傳統的GUI形式一樣。您將需要「前進」從QLineEdit
的editingFinished()
或textEdited(const QString& text)
信號到你的QGraphicsTextItem
,所以你不必提供對小部件的外部訪問。
- 您也可以使用
QGraphicsTextItem
的內部QTextDocument
,這實際上是持有和格式化文本(使用document()
訪問它)。但它不支持安裝QValidator
,所以您必須創建一個信號插槽循環,從而在文本發生更改(由contentsChanged()
發送信號)時,QGraphicsTextItem
會收到驗證,然後在驗證失敗時更新/清除(它將更新QTextDocument
,並再次觸發此過程),或者如果它通過則忽略。
兩者都難以實施;第一個需要更多的代碼,但會讓您更好地控制文本框的外觀。
可以[QTextDocument :: contentsChanged()](http://qt-project.org/doc/qt-5.0/qtgui/qtextdocument.html#contentsChanged)信號有效嗎?你可以用另外,QTextDocument對象[QGraphicsTextItem ::文件()](http://qt-project.org/doc/qt-5.0/qtwidgets/qgraphicstextitem.html#document)。我只是在這裏猜測。 – thuga
@thuga好主意,它當然不會比其他方法更復雜。我已經編輯它了。 – cmannett85
謝謝你們!真正有用的建議 –