QT - множественный выбор - PullRequest
6 голосов
/ 02 декабря 2011

Я хотел бы создать текстовое поле поискового типа в QT, которое может содержать как стандартный текст, так и то, что я бы назвал «тегами» ... в основном дополнительные поисковые термины, которые выделены и отделены индивидуально.Я предполагаю, что это выглядит как множественный выбор в "Chosen" (библиотека Javascript).http://harvesthq.github.com/chosen/

Мне не удалось найти ничего подобного в результате поиска.Также кажется, что стандартные типы текстовых полей QT не предназначены для «подвиджетов».

Похоже, что QTextEdit поддерживает HTML ... это может быть возможностью ... но документы не оченьмне ясно, что поддерживается с точки зрения CSS (который, я думаю, потребуется для получения желаемого форматирования).http://doc.qt.io/qt-5/qtextedit.html#html-prop

Забавно ... Я добрался до конца этой страницы представления и понял, что должен пометить это (это мой первый ТАК вопрос) ... Это поле для добавления тегов почти точноЯ хочу!

Ответы [ 2 ]

1 голос
/ 26 декабря 2011

Нет готовой к употреблению души, которую я знаю.Если бы я попытался реализовать его, я бы определенно использовал виджет с макетом, в котором есть два типа дочерних виджетов: LineEdits (без полей, чтобы быть похожим на фактическую часть большего виджета) и кнопки - изменения в редактировании строки, управляющие кодом, просто добавятКнопки до или после и, если необходимо, разделяются на две линии с помощью кнопки между ними.Этот способ не вмешивается в намерения программистов qt о том, как использовать виджеты и как их все совместить в одном стиле.

Если вы хотите, вы можете использовать пользовательские виджеты вместо кнопок для предоставления значка удаления.Как я написал в своем комментарии - если у меня будет немного больше времени, я сам постараюсь сделать что-то подобное.

1 голос
/ 24 декабря 2011

Вот очень простая реализация помещения кнопок в 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, системы с кнопками с широким полем приводят к тому, что кнопки тегов перекрывают текст, который набирает пользователь в данный момент.Я изменил код, чтобы обеспечить поля для вставленных кнопок (с таблицами стилей), добавил дополнительный пробел для каждого пробела, который вводит пользователь, и установил для ContentMargins QHBoxLayout такую ​​же ширину, что и пробел (" ").Теперь кнопки не будут перекрывать вставленный текст.

...