You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将一个窗口QListWidget的多条选中项转移到另一窗口的QListWidget

批量转移QListWidget选中条目实现方案

你当前代码仅支持单次转移单个条目,核心原因是绑定了itemClicked信号,每次触发仅传递当前点击的单个条目对象,未遍历全部选中条目列表。

修改后完整可运行代码

from PyQt5.QtWidgets import (
    QApplication,
    QMainWindow,
    QDialog,
    QWidget,
    QVBoxLayout,
    QLabel,
    QPushButton,
    QListWidget,
    QAbstractItemView
    )


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.user_input = QListWidget()
        self.user_input.addItem("2")
        self.user_input.addItem("3")
        self.user_input.addItem("4")
        self.user_input.addItem("5")
        # 开启多选模式
        self.user_input.setSelectionMode(QAbstractItemView.ExtendedSelection)
        self.populate()
        self.show()

    def populate(self):
        # 新增转移按钮
        self.transfer_btn = QPushButton("转移选中条目到弹窗")
        widgets = [QLabel("可选条目"), self.user_input, self.transfer_btn]
        centralWidget = self.group_widgets(widgets)
        self.setCentralWidget(centralWidget)

    def group_widgets(self, widgets):
        parentWidget = QWidget()
        layout = QVBoxLayout()
        for widget in widgets: 
            layout.addWidget(widget)
        parentWidget.setLayout(layout)
        return parentWidget

    def when_input(self, function):
        self.user_input.itemClicked.connect(self.printItemText)
        # 绑定按钮点击触发批量转移
        self.transfer_btn.clicked.connect(lambda: self.batch_transfer(function))
    
    def batch_transfer(self, transfer_func):
        selected_items = self.user_input.selectedItems()
        if not selected_items:
            return
        # 收集选中项的行号,倒序排列避免删除时索引偏移
        selected_rows = sorted([self.user_input.row(item) for item in selected_items], reverse=True)
        # 批量添加到目标窗口
        for item in selected_items:
            transfer_func(item.text())
        # 倒序删除原列表的选中条目(如果是复制需求可删除以下两行)
        for row in selected_rows:
            self.user_input.takeItem(row)
        # 清空原列表选中状态
        self.user_input.clearSelection()
        
    def printItemText(self):
        items = self.user_input.selectedItems()
        x = [item.text() for item in items]
        print(x)

class Dialog(QDialog):
    def __init__(self):
        super().__init__()
        self.user_input = QListWidget()
        self.populate()
        self.show()

    def populate(self):
        widgets = self.get_widgets()
        layout = self.get_layout(widgets)
        self.setLayout(layout)

    def get_widgets(self):
        widgets = [
            QLabel("已转移条目"),
            self.user_input,
            ]
        return widgets

    def get_layout(self, widgets):
        layout = QVBoxLayout()
        for widget in widgets: 
            layout.addWidget(widget)
        return layout


def main():
    app = QApplication([])
    mainWindow = MainWindow()
    dialog = Dialog()
    mainWindow.when_input(lambda text: dialog.user_input.addItem(text))
    app.exec_()

if __name__ == "__main__":
    main()

关键改动说明

  • 主窗口新增转移操作按钮,避免点击条目就触发转移的误操作
  • 调整信号绑定逻辑:将原来绑定itemClicked信号改为绑定按钮点击信号,触发时统一处理所有选中条目
  • 批量处理逻辑:先收集所有选中条目的文本插入目标窗口,再倒序删除原列表中选中的条目,避免正序删除时前面条目移除后后续条目索引变化导致的删除错误
  • 如果仅需要复制条目而非移动,删除原列表的takeItem相关代码即可

内容的提问来源于stack exchange,提问作者user16817750

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 06:42:01