【问题标题】:Has anyone implemented a way to move selected items from one list view box to another in pyqt 5?有没有人在pyqt 5中实现了一种将选定项目从一个列表视图框中移动到另一个的方法?
【发布时间】:2024-01-20 13:38:01
【问题描述】:

我正在尝试在 PyQt 5-python 中实现下图中的类似功能,我不一定要寻找向上/向下按钮,而是使用确定按钮来获取所选项目的列表。我没有看到为 pyqt5 实现的任何类似示例,我想知道是否有人有一些方向?

【问题讨论】:

    标签: python listview pyqt5 multi-select


    【解决方案1】:

    previous answer 中我详细说明了响应和 C++ 中的实现,现在我只将其翻译为 PyQt:

    from PyQt5 import QtCore, QtWidgets
    
    class TwoListSelection(QtWidgets.QWidget):
        def __init__(self, parent=None):
            super(TwoListSelection, self).__init__(parent)
            self.setup_layout()
    
        def setup_layout(self):
            lay = QtWidgets.QHBoxLayout(self)
            self.mInput = QtWidgets.QListWidget()
            self.mOuput = QtWidgets.QListWidget()
    
            self.mButtonToSelected = QtWidgets.QPushButton(">>")
            self.mBtnMoveToAvailable= QtWidgets.QPushButton(">")
            self.mBtnMoveToSelected= QtWidgets.QPushButton("<")
            self.mButtonToAvailable = QtWidgets.QPushButton("<<")
    
            vlay = QtWidgets.QVBoxLayout()
            vlay.addStretch()
            vlay.addWidget(self.mButtonToSelected)
            vlay.addWidget(self.mBtnMoveToAvailable)
            vlay.addWidget(self.mBtnMoveToSelected)
            vlay.addWidget(self.mButtonToAvailable)
            vlay.addStretch()
    
            self.mBtnUp = QtWidgets.QPushButton("Up")
            self.mBtnDown = QtWidgets.QPushButton("Down")
    
            vlay2 = QtWidgets.QVBoxLayout()
            vlay2.addStretch()
            vlay2.addWidget(self.mBtnUp)
            vlay2.addWidget(self.mBtnDown)
            vlay2.addStretch()
    
            lay.addWidget(self.mInput)
            lay.addLayout(vlay)
            lay.addWidget(self.mOuput)
            lay.addLayout(vlay2)
    
            self.update_buttons_status()
            self.connections()
    
        @QtCore.pyqtSlot()
        def update_buttons_status(self):
            self.mBtnUp.setDisabled(not bool(self.mOuput.selectedItems()) or self.mOuput.currentRow() == 0)
            self.mBtnDown.setDisabled(not bool(self.mOuput.selectedItems()) or self.mOuput.currentRow() == (self.mOuput.count() -1))
            self.mBtnMoveToAvailable.setDisabled(not bool(self.mInput.selectedItems()) or self.mOuput.currentRow() == 0)
            self.mBtnMoveToSelected.setDisabled(not bool(self.mOuput.selectedItems()))
    
        def connections(self):
            self.mInput.itemSelectionChanged.connect(self.update_buttons_status)
            self.mOuput.itemSelectionChanged.connect(self.update_buttons_status)
            self.mBtnMoveToAvailable.clicked.connect(self.on_mBtnMoveToAvailable_clicked)
            self.mBtnMoveToSelected.clicked.connect(self.on_mBtnMoveToSelected_clicked)
            self.mButtonToAvailable.clicked.connect(self.on_mButtonToAvailable_clicked)
            self.mButtonToSelected.clicked.connect(self.on_mButtonToSelected_clicked)
            self.mBtnUp.clicked.connect(self.on_mBtnUp_clicked)
            self.mBtnDown.clicked.connect(self.on_mBtnDown_clicked)
    
        @QtCore.pyqtSlot()
        def on_mBtnMoveToAvailable_clicked(self):
            self.mOuput.addItem(self.mInput.takeItem(self.mInput.currentRow()))
    
        @QtCore.pyqtSlot()
        def on_mBtnMoveToSelected_clicked(self):
            self.mInput.addItem(self.mOuput.takeItem(self.mOuput.currentRow()))
    
        @QtCore.pyqtSlot()
        def on_mButtonToAvailable_clicked(self):
            while self.mOuput.count() > 0:
                self.mInput.addItem(self.mOuput.takeItem(0))
    
        @QtCore.pyqtSlot()
        def on_mButtonToSelected_clicked(self):
            while self.mInput.count() > 0:
                self.mOuput.addItem(self.mInput.takeItem(0))        
    
        @QtCore.pyqtSlot()
        def on_mBtnUp_clicked(self):
            row = self.mOuput.currentRow()
            currentItem = self.mOuput.takeItem(row)
            self.mOuput.insertItem(row - 1, currentItem)
            self.mOuput.setCurrentRow(row - 1)
    
        @QtCore.pyqtSlot()
        def on_mBtnDown_clicked(self):
            row = self.mOuput.currentRow()
            currentItem = self.mOuput.takeItem(row)
            self.mOuput.insertItem(row + 1, currentItem)
            self.mOuput.setCurrentRow(row + 1)
    
        def addAvailableItems(self, items):
            self.mInput.addItems(items)
    
        def get_left_elements(self):
            r = []
            for i in range(self.mInput.count()):
                it = self.mInput.item(i)
                r.append(it.text())
            return r
    
        def get_right_elements(self):
            r = []
            for i in range(self.mOuput.count()):
                it = self.mOuput.item(i)
                r.append(it.text())
            return r
    if __name__ == '__main__':
        import sys
        app = QtWidgets.QApplication.instance()
        if app is None:
            app = QtWidgets.QApplication(sys.argv)
        list_selection = TwoListSelection()
        list_selection.addAvailableItems(["item-{}".format(i) for i in range(5)])
        def on_clicked_left():
            print(list_selection.get_left_elements())
        def on_clicked_right():
            print(list_selection.get_right_elements())
        l_button = QtWidgets.QPushButton(
            text="print left elements",
            clicked=on_clicked_left
        )
        r_button = QtWidgets.QPushButton(
            text="print right elements",
            clicked=on_clicked_right
        )
        w = QtWidgets.QWidget()
        lay = QtWidgets.QVBoxLayout(w)
        hlay = QtWidgets.QHBoxLayout()
        hlay.addWidget(l_button)
        hlay.addWidget(r_button)
        lay.addLayout(hlay)
        lay.addWidget(list_selection)
        w.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 这很好用,我只是想知道如何从右侧的选定项目中获取项目列表?我的意思是在单击“确定”按钮后捕获所有选定的按钮。
    • @user9529330 我已经添加了 get_right_elements 方法,该方法从右侧列表中返回项目列表
    • 我试图在我的 QMainWindow 类上调用 TwoListSelection 类以将两个列表视图添加为小部件,但每次 iPython 控制台关闭时都会显示一条消息,显示“启动内核时发生错误”。我不确定是什么原因造成的,想知道您是否也有类似的情况?
    • @user9529330 我不使用 ipython,由于不知道您的代码,我无法帮助您,发布一个新问题,清楚地说明您使用的完整代码,以便社区可以帮助您