QT - 多选

时间:2011-12-02 06:11:24

标签: c++ qt user-interface multi-select

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

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

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

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

2 个答案:

答案 0 :(得分: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的contentsMargins设置为与空格相同的宽度(“ “)。现在按钮不会与插入的文本重叠。

答案 1 :(得分:1)

我知道没有现成的灵魂。 如果我尝试实现它,我肯定会使用带有布局的小部件,其中有两种类型的子小部件:LineEdits(无边框看起来像更大的小部件的实际部分)和按钮 - 代码管理行编辑更改只会添加新的之前或之后的按钮,如果必要的话,将两个按钮之间的按钮分成两个按钮。这种方式并没有干扰qt程序员关于如何使用小部件的意图,以及如何使它们在一种风格中完全融合在一起。

如果您需要,可以使用自定义小部件而不是按钮来提供删除图标。 正如我在评论中写的那样 - 如果我有更多的时间,我会尝试自己制作类似的东西。