Я хочу использовать QT для достижения эффекта Select-Option, поддерживать удаление Option, нажав кнопку закрытия, это мой ожидаемый рендеринг:
Ниже приведена моя демонстрация. Я хочу создать пользовательскую вставку виджета в QListWidget для достижения этого эффекта, но логика закрытия параметра кажется непростой.
Или я так мыслю совершенно неправильно?
from PyQt5 import QtCore
from PyQt5 import QtWidgets
class WID(QtWidgets.QWidget):
def __init__(self, parent=None):
super(WID, self).__init__(parent)
self.setMaximumSize(QtCore.QSize(99, 43))
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.label = QtWidgets.QLabel(self)
self.label.setLayoutDirection(QtCore.Qt.LeftToRight)
self.label.setStyleSheet("border:none;")
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.toolButton = QtWidgets.QToolButton(self)
self.toolButton.setLayoutDirection(QtCore.Qt.LeftToRight)
self.toolButton.setObjectName("toolButton")
self.horizontalLayout.addWidget(self.toolButton)
self.horizontalLayout_2.addLayout(self.horizontalLayout)
self.label.setText("1234")
self.toolButton.setText("x")
class ListWidget(QtWidgets.QListWidget):
def __init__(self, parent=None):
super(ListWidget, self).__init__(parent)
self.verticalLayout = QtWidgets.QVBoxLayout(self)
self.setFlow(QtWidgets.QListView.LeftToRight)
self.setResizeMode(QtWidgets.QListView.Fixed)
for i in range(0, 3):
wid = WID()
item = QtWidgets.QListWidgetItem(self)
item.setSizeHint(QtCore.QSize(100, 100))
self.setItemWidget(item, wid)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
listWidget = ListWidget()
listWidget.show()
sys.exit(app.exec_())
Если это похоже на интерфейс SO для добавления тегов к вопросу, то я думаю, вам также понадобится какой-то QLineEdit или QTextEdit с QCompleter, чтобы пользователь мог вводить новые параметры выбора. Альтернативным способом достижения того же эффекта было бы размещение виджетов WID внутри QHBoxLayout внутри QGroupBox. Добавьте QSpacer справа, чтобы все ваши WID были выровнены по левому краю. Вы должны иметь возможность использовать методы addItem() и removeItem() для добавления и удаления WID.
@bfris tks, я использовал QHBoxLayout.addWidget
, который выглядит немного проще
Привет! @musicamante я обновил код
Я использую метод QHBoxLayout::addWidget
для добавления виджетов и использую соль deleteLater
для удаления QWidget:
from PyQt5 import QtCore
from PyQt5 import QtWidgets
class WID(QtWidgets.QWidget):
def __init__(self, parent=None):
super(WID, self).__init__(parent)
self.setMaximumSize(QtCore.QSize(99, 43))
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.label = QtWidgets.QLabel(self)
self.label.setLayoutDirection(QtCore.Qt.LeftToRight)
self.label.setStyleSheet("border:none;")
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.toolButton = QtWidgets.QToolButton(self)
self.toolButton.setLayoutDirection(QtCore.Qt.LeftToRight)
self.toolButton.setObjectName("toolButton")
self.horizontalLayout.addWidget(self.toolButton)
self.horizontalLayout_2.addLayout(self.horizontalLayout)
self.label.setText("1234")
self.toolButton.setText("x")
self.toolButton.clicked.connect(self.deleteLater)
class ListWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(ListWidget, self).__init__(parent)
self.setObjectName("self")
self.resize(437, 29)
self.setTabletTracking(False)
self.setLayoutDirection(QtCore.Qt.LeftToRight)
self.setStyleSheet("background-color: rgb(255, 255, 255);")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self)
self.horizontalLayout_2.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)
self.horizontalLayout_2.setContentsMargins(-1, 0, 0, 0)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
QtCore.QMetaObject.connectSlotsByName(self)
self.horizontalLayout_2.setAlignment(QtCore.Qt.AlignLeft)
for i in range(0, 3):
self.addWidget()
def addWidget(self):
self.horizontalLayout_2.addWidget(WID())
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
listWidget = ListWidget()
listWidget.show()
sys.exit(app.exec_())
Я не вижу никакой «логики закрытия опции» в этом коде.