Как использовать pyqt для достижения эффекта добавления и удаления Select-Option

Я хочу использовать QT для достижения эффекта Select-Option, поддерживать удаление Option, нажав кнопку закрытия, это мой ожидаемый рендеринг: Как использовать pyqt для достижения эффекта добавления и удаления Select-Option

Ниже приведена моя демонстрация. Я хочу создать пользовательскую вставку виджета в QListWidget для достижения этого эффекта, но логика закрытия параметра кажется непростой. Или я так мыслю совершенно неправильно? Как использовать pyqt для достижения эффекта добавления и удаления Select-Option

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_())

Я не вижу никакой «логики закрытия опции» в этом коде.

musicamante 22.03.2022 19:16

Если это похоже на интерфейс SO для добавления тегов к вопросу, то я думаю, вам также понадобится какой-то QLineEdit или QTextEdit с QCompleter, чтобы пользователь мог вводить новые параметры выбора. Альтернативным способом достижения того же эффекта было бы размещение виджетов WID внутри QHBoxLayout внутри QGroupBox. Добавьте QSpacer справа, чтобы все ваши WID были выровнены по левому краю. Вы должны иметь возможность использовать методы addItem() и removeItem() для добавления и удаления WID.

bfris 22.03.2022 19:43

@bfris tks, я использовал QHBoxLayout.addWidget, который выглядит немного проще

Alex 23.03.2022 08:23

Привет! @musicamante я обновил код

Alex 23.03.2022 08:25
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
28
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я использую метод 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_())

Другие вопросы по теме