2013-06-13 42 views
4

我真的陷入了與Qt的GraphicsView任務文本和發射信號。任何幫助或建議將不勝感激。 在我的QGraphicsView應用程序中,我添加了幾個可編輯的QGraphicsTextItems,添加到場景中。我需要以下功能:Qt的可編輯QGraphicsTextItem驗證的變化

  • 設置float的驗證器,以便用戶不會錯誤地在該文本項目中輸入字符或換行。
  • 用戶更改文字後發出信號。

任何人都可以請建議如何我可以在我的應用程序中實現這個?我已經努力嘗試,但我無法找到任何合適的東西。如果有其他解決辦法或解決辦法,我會很感激。

謝謝!

回答

6

QGraphicsTextItem不支持此功能,因爲我相信你已經發現。所以,你有幾種選擇:

  1. 重新實現focusOutEvent(QFocusEvent* event)和/或​​當你驗證需要運行檢測。一個QValidator可以爲你的文字類的成員創建,並詢問或者丟失焦點時和/或按下某個鍵(回車鍵表示完成,或在每一個字母)。然後,只要在編輯完成或更改時爲您創建自定義信號。
  2. 使用GraphicsProxyWidget來保存文本輸入的'真實'QLineEdit,只需使用驗證器進行設置即可,就像置入傳統的GUI形式一樣。您將需要「前進」從QLineEditeditingFinished()textEdited(const QString& text)信號到你的QGraphicsTextItem,所以你不必提供對小部件的外部訪問。
  3. 您也可以使用QGraphicsTextItem的內部QTextDocument,這實際上是持有和格式化文本(使用document()訪問它)。但它不支持安裝QValidator,所以您必須創建一個信號插槽循環,從而在文本發生更改(由contentsChanged()發送信號)時,QGraphicsTextItem會收到驗證,然後在驗證失敗時更新/清除(它將更新QTextDocument,並再次觸發此過程),或者如果它通過則忽略。

兩者都難以實施;第一個需要更多的代碼,但會讓您更好地控制文本框的外觀。

+0

可以[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

+0

@thuga好主意,它當然不會比其他方法更復雜。我已經編輯它了。 – cmannett85

+0

謝謝你們!真正有用的建議 –