QT - 多选

Dan*_*cek 6 c++ user-interface qt multi-select

我想在QT中创建一个搜索类型的文本字段,它可以包含标准文本以及我称之为"标签"的内容......基本上是单独突出显示和分隔的其他搜索字词.我设想这看起来像"选择"(Javascript库)中的多选.http://harvesthq.github.com/chosen/

我一直无法通过搜索找到类似的东西.似乎标准的QT文本框类型也没有设计为具有"子小部件".

似乎QTextEdit支持HTML ......这可能是可能的......但是对于我而言,文档并不是很清楚,因为CSS支持(我认为需要获得所需的格式).http://doc.qt.io/qt-5/qtextedit.html#html-prop

它很有趣......我到了这个提交页面的底部并意识到我必须标记这个(这是我的第一个问题)...这个标签加法器盒几乎就是我想要的!

D K*_*D K 1

下面是一个非常简单的实现,将按钮放入 aQLineEdit作为用户输入,用 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_()
Run Code Online (Sandbox Code Playgroud)

它会创建一个QHBoxLayout并为您键入的每个单词添加一个按钮,并在您删除该单词时取消该按钮。

如果您想在每个子小部件内放置一个关闭按钮,您也可以为此创建一个自定义小部件。

编辑

正如 j_kubik 的评论所述,具有宽边距按钮的系统会导致标签按钮与用户当前正在输入的文本重叠。我修改了代码以强制插入的按钮的边距(使用样式表),为用户键入的每个空间添加一个额外的空格,并将 的contentMargins 设置QHBoxLayout为与空格(“”)相同的宽度。现在按钮将不会与插入的文本重叠。