2011-12-02 41 views
6

我想在QT中創建一個搜索類型的文本字段,它既可以包含標準文本,也可以包含我稱之爲「標籤」的內容...基本上單獨突出顯示和分隔的其他搜索項。我想這看起來像「選擇」(Javascript庫)中的多選。 http://harvesthq.github.com/chosen/QT - 多選

我一直無法找到任何類似的搜索。它似乎也是標準的QT文本框類型沒有被設計成具有「子小部件」。

看來,QTextEdit支持HTML ......這可能是一種可能性......但這些文檔對我來說並不是很清楚,因爲CSS支持哪些內容(我認爲這將需要獲得所需的格式)。 http://doc.qt.io/qt-5/qtextedit.html#html-prop

其有趣...我到了這個提交頁面的底部,並意識到我必須標記這個(這是我的第一個SO問題)...這個標籤添加框幾乎就是我想要的!

+0

關於CSS兼容性:http://developer.qt.nokia.com/doc/qt-4.8/richtext-html-subset.html。您可以嘗試使用表格和一些CSS魔法來模擬所需的行爲,儘管它不會很容易,因爲richtext不支持任何輸入組件('刪除標記'按鈕?)。您應該提供更多有關所需行爲的信息,以獲得更準確的答案。每個單詞都應該被「標記」,還是隻有少量標籤的文字?被標記的單詞應該保持可編輯還是僅可移除?如果我有一段時間,我會嘗試創造一些你需要的東西。 –

回答

1

這裏是一個非常簡單的實現把按鈕一QLineEdit作爲用戶類型,用Python寫的:

from PySide.QtCore import * 
from PySide.QtGui import * 

class Entry(QLineEdit): 

    def __init__(self): 
     QLineEdit.__init__(self) 
     self.buttons = [] 
     self.backupText = '' 
     self.textEdited.connect(self.on_change) 
     self.layout = QHBoxLayout() 
     self.setLayout(self.layout) 
     self.layout.addStretch() 
     marginz = QLabel(' ') 
     marginz.show() 
     margin = marginz.width() 
     marginz.hide() 
     self.layout.setContentsMargins(margin, margin, margin, margin) 

    def on_change(self): 
     if self.text()[-1] == ' ' and not self.text().endswith(' '): 
      if len(self.text()) > len(self.backupText): 
       self.setText(self.text() + ' ') 
       self.buttons.append(QPushButton(self.text().split()[-1])) 
       self.layout.insertWidget(self.layout.count()-1, self.buttons[-1]) 
      else: 
       self.setText(self.text()[0:-1]) 
       self.buttons[-1].hide() 
       del self.buttons[-1] 
     self.backupText = self.text() 


app = QApplication([]) 

window = QMainWindow() 
window.setStyleSheet(
    'QPushButton {border: 1px solid gray; background: lightgray; color: black;}') 
entry = Entry() 
window.setCentralWidget(entry) 
window.show() 

app.exec_() 

它創建了一個QHBoxLayout,並增加了一個按鈕,它爲你輸入的每個字,並採取當你擺脫這個詞的時候,按鈕就離開了。

如果您想要在每個子小部件中放置一個關閉按鈕,您也可以爲其創建一個自定義小部件。

編輯

由於j_kubik的評論指出,具有廣泛的利潤按鈕系統會導致標籤按鈕重疊用戶目前鍵入的文本。我修改了代碼以強制插入按鈕的邊距(使用樣式表),爲用戶鍵入的每個空間添加了額外的空間,並將QHBoxLayout的內容Margin設置爲與空格相同的寬度(「」)。現在這些按鈕不會與插入的文本重疊。

+1

它是如何正確對齊的?我的意思是這些按鈕會比文字更寬,它們會不會重疊下一個輸入的單詞?這將是很高興看到正在寫什麼。我認爲要使它看起來很好,並且可以在不同的系統之間移植,並且可以使用它使用html或使用C++/python和按鈕小部件從頭開始重寫的樣式。 –

+0

我應該在問題中提到 - 我正在使用C++ ...我將嘗試將您的答案轉換爲C++並查看我得到的結果。感謝代碼。 –

1

我知道沒有準備使用的靈魂。 如果我嘗試實現它,我肯定會使用小部件和佈局,其中有兩種類型的子小部件:LineEdits(無邊界看起來像更大的小部件的實際部分)和按鈕 - 管理線編輯更改的代碼只需添加新的按鈕之前或之後,如果需要拆分linedit成tw與按鈕之間。這種方式不會干擾qt程序員關於如何使用小部件的意圖以及如何使它們都以一種風格融合在一起。

如果您希望您可以使用自定義小部件而不是按鈕來提供刪除圖標。 正如我在我的評論中寫道的 - 如果我有更多時間,我會盡力讓自己變得像那樣。