PyQt5 QListWidget удалить наведение мыши QListItem - PullRequest
0 голосов
/ 21 мая 2018

Я застрял в проблеме PyQt5 Qlistwidget.ниже приведен текущий код, который у меня есть:

from PyQt5 import QtWidgets, QtCore, QtGui
import sys

class FlatUIListWidget(QtWidgets.QListWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setStyleSheet("""
                QScrollBar:vertical {              
            border: none;
            background:white;
            width:3px;
            margin: 0px 0px 0px 0px;
        }
        QScrollBar::handle:vertical {
            background: qlineargradient(x1:0, y1:0, x2:1, y2:0,
            stop: 0 rgb(32, 47, 130), stop: 0.5 rgb(32, 47, 130), stop:1 rgb(32, 47, 130));
            min-height: 0px;
        }
        QScrollBar::add-line:vertical {
            background: qlineargradient(x1:0, y1:0, x2:1, y2:0,
            stop: 0 rgb(32, 47, 130), stop: 0.5 rgb(32, 47, 130),  stop:1 rgb(32, 47, 130));
            height: 0px;
            subcontrol-position: bottom;
            subcontrol-origin: margin;
        }
        QScrollBar::sub-line:vertical {
            background: qlineargradient(x1:0, y1:0, x2:1, y2:0,
            stop: 0  rgb(32, 47, 130), stop: 0.5 rgb(32, 47, 130),  stop:1 rgb(32, 47, 130));
            height: 0 px;
            subcontrol-position: top;
            subcontrol-origin: margin;
        }
    """)


    def add_custom_widget(self, widget):
        myQListWidgetItem = QtWidgets.QListWidgetItem(self)
        # Set size hint
        myQListWidgetItem.setSizeHint(widget.sizeHint())
        # Add QListWidgetItem into QListWidget
        self.addItem(myQListWidgetItem)
        self.setItemWidget(myQListWidgetItem, widget)


class DummyWidget(QtWidgets.QWidget):
    delete_signal = QtCore.pyqtSignal(str)
    def __init__(self, text):
        super().__init__()
        self.text = text
        self.layout = QtWidgets.QVBoxLayout(self)
        self.delete_button = QtWidgets.QPushButton(text)
        self.delete_button.clicked.connect(self.on_delte_button_clicked)
        self.layout.addWidget(self.delete_button)


    def on_delte_button_clicked(self):
        self.delete_signal.emit(self.text)


class Container(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.layout = QtWidgets.QVBoxLayout(self)
        self.list_widget = FlatUIListWidget()
        self.layout.addWidget(self.list_widget)
        for i in range(10):
            self.add_widget(str(i))

    def add_widget(self, text):
        item = DummyWidget(text)
        item.delete_signal.connect(self.on_item_delete)
        self.list_widget.add_custom_widget(item)

    def on_item_delete(self, string):
        try:
            # cursor = QtGui.QCursor()
            # print(cursor.pos())
            # print(self.list_widget.itemAt(cursor.pos()))
            # print(self.list_widget.selectedItems())
            # print(self.sender().parent().parent())
            # print(self.list_widget.currentRow())
            # self.list_widget.setCurrentItem(self.sender().parent())
            # self.list_widget.takeItem(self.sender().parent())
            print(string)
            self.list_widget.takeItem(self.list_widget.currentRow())
        except Exception as e:
            print(e)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    mw = Container()
    mw.show()
    sys.exit(app.exec_())

В принципе, я хочу создать QListWidget со всеми настроенными элементами.В каждом из этих пунктов есть кнопка, позволяющая пользователю удалить себя.Я пробовал следующее:

  1. подключить сигнал нажатия кнопки к self.sender().deleteLater().Это не работает, так как он только удаляет виджет внутри QListWidgetItem и оставит пустое поле в QListWidget.

  2. после нажатия кнопки, отправьте сигнал на Container виджет и удаление текущей строки.Это также не работает, потому что вам действительно нужно сначала выбрать виджет и нажать «Удалить», иначе он удалит самую первую строку.

  3. дал каждому виджету элемента тег имени и после щелчкакнопку, перебирая список и используйте takeItem(), чтобы удалить один и тот же тег.Я просто думаю, что этот подход не элегантен ...

Я думаю, что было бы разумнее, если бы я мог каким-то образом получить номер строки для виджета, какая кнопка была нажата и использоватьtakeItem() на self.list_widget.row(row_number), чтобы удалить.Я просто не мог понять, как.

Я прочитал официальный документ QListWidget и QListWidgetItems, который не дал мне ответа.Я был бы очень признателен, если бы кто-нибудь мог предоставить некоторые идеи.

Добавление настраиваемого виджета в QListWidget переписано из этого поста: PyQt QListWidget custom items

1 Ответ

0 голосов
/ 21 мая 2018

Чтобы исключить элемент с помощью QWidget, выполните следующую процедуру:

  • Получить положение виджета относительно viewport(), в этом случае это легкопоскольку виджет (DummyWidget) является потомком viewport(), поэтому мы должны использовать только self.sender().pos().

  • Используя позицию, мы получаем элемент через itemAt().

  • Используя элемент, мы получаем строку через row().

  • И затем исключаем ее с помощью takeItem().

Реализация выглядит следующим образом:

def on_item_delete(self, string):
    it = self.list_widget.itemAt(self.sender().pos())
    row = self.list_widget.row(it)
    item = self.list_widget.takeItem(row)
    del item
...