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