PyQt4:将项目从一个 QListWidget 移动到另一个

Posted

技术标签:

【中文标题】PyQt4:将项目从一个 QListWidget 移动到另一个【英文标题】:PyQt4: Move items from one QListWidget to another 【发布时间】:2012-03-15 02:43:39 【问题描述】:

我在 Qt Designer 上创建了一个界面,并在 QGIS 插件中使用它。该接口由源listWidget、目标listWidgetpushButton组成。

我正在尝试将所选项目从源 listWidget 带到目标 listWidget

我使用我的来源 listWidget 填充:

self.ui.listWidget_1.addItems(soilList)

到目前为止,我将按钮信号写为:

QObject.connect(self.ui.pushButton, SIGNAL("clicked()"), self.click_pushButton)

但现在我无法编写填充目标listWidgetclick_pushButton 函数。任何帮助将不胜感激,谢谢!

【问题讨论】:

【参考方案1】:

QListWidget.selectedIndexes() 将返回所选项目的索引列表。每个索引都有一个 .row() 方法返回项目的行。然后您可以使用.takeItem() 从第一个列表中获取(并删除)该项目,并通过.addItem() 将其添加到第二个列表中。

意思是:

def click_pushButton(self):
    # sort rows in descending order in order to compensate shifting due to takeItem
    rows = sorted([index.row() for index in self.ui.listWidget_1.selectedIndexes()],
                  reverse=True)
    for row in rows:
        # assuming the other listWidget is called listWidget_2
        self.ui.listWidget_2.addItem(self.ui.listWidget_1.takeItem(row))

# moving all items:
def click_pushButton(self):
    for row in reversed(range(self.ui.listWidget_1.count()):
        # assuming the other listWidget is called listWidget_2
        self.ui.listWidget_2.addItem(self.ui.listWidget_1.takeItem(row))

顺便说一下,请给您的小部件/方法起有意义的名称。 listWidget_1click_pushButton 没有说明这些代表什么。

并使用new style signals and slots。您可以像这样编写连接语句:

self.ui.pushButton.clicked.connect(self.click_pushButton)

【讨论】:

非常感谢!我还尝试编写一个代码,一次移动 ListWidget 中的所有项目: def move_all_items_todestination(self): for index in range(len(self.ui.sourceList)): self.ui.destinationList.addItem(self. ui.sourceList.takeItem(index)) 但是当我执行 pushButton 时,它只会将我的源 listWidget 中的一半项目移动到我的目标 listWidget 而不是全部。关于它为什么这样做的任何想法? @user1270516:哎哟! :)。 .takeItem 删除了这个东西,所以索引被移动了。您需要从最大的索引开始。我将编辑我的答案。【参考方案2】:

除非克隆,否则 QListwidgetitem 只能存在于一个 QListwidget 中。

这是一个直接的 PyQt5 解决方案,它避免了索引的簿记:

self.ui.clone_items_button.clicked.connect(self.clone_selected_listwidgetitems)

def clone_selected_listwidgetitems(self)
    for sel_item in self.ui.source_listwidget.selectedItems():
        cloned_item = sel_item.clone()
        self.ui.destination_listwidget.addItem(cloned_item)

【讨论】:

以上是关于PyQt4:将项目从一个 QListWidget 移动到另一个的主要内容,如果未能解决你的问题,请参考以下文章

PyQt4:如何获取 QlistWidget 的可见项目列表?

PyQt4:使用 QPushButton 小部件从 QList 小部件中删除项目

pyqt将一个小部件添加到QListWidget

Python PyQt4 QFileDialog 图像并在 QListWidget 中加载

PyQt5 QListWidget自定义项目[重复]

在 Pyqt4 中用不同的 QMainWindow 刷新 QMainWindow