【问题标题】:How to transfer items from QListWidget based in one window to another QListWidget based in another window?如何将项目从一个窗口中的 QListWidget 转移到另一个窗口中的另一个 QListWidget?
【发布时间】:2021-11-01 07:27:29
【问题描述】:

话虽如此,我希望能够将我的项目从基于一个窗口的 QListWidget 转移到另一个窗口。

下面的代码允许我一次转移一件物品, 但我正在努力想办法转移多个项目 一次。

(下面的代码来自我找到并已更改的示例。)

from PyQt5.QtWidgets import (
    QApplication,
    QMainWindow,
    QDialog,
    QWidget,
    QVBoxLayout,
    QLineEdit,
    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.populate()
        self.show()
        self.user_input.setSelectionMode(QAbstractItemView.ExtendedSelection)

    def populate(self):
        widgets = [QLabel("Insert a number"), self.user_input]
        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.textChanged.connect(function)
        self.user_input.itemClicked.connect(self.printItemText)
        self.user_input.itemClicked.connect(function)
        
    def printItemText(self):
        items = self.user_input.selectedItems()
        x = []
        for i in range(len(items)):
            x.append(str(self.user_input.selectedItems()[i].text()))

        print (x)

class Dialog(QDialog):
    def __init__(self):
        super().__init__()
        self.user_input = QListWidget()
        self.relay_sum = None  # function to relay result of addition
        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("Inserted number"),
            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(str(text.text())))
    app.exec_()

if __name__ == "__main__":
    main()

【问题讨论】:

  • 您的问题不清楚,在您的示例中,当该项目被按下时,该项目被转移。转移物品必须发生什么事件?这些物品是什么?
  • 当项目被点击或选择时,我希望它转移到第二个列表。目前,如果您单独单击 2 个项目:“2”或“3”,它们将出现在第二个列表中,但是当我 shift+单击多个项目时,它只会传输我单击的项目而不是所有突出显示的项目。

标签: python python-3.x pyqt5 qlistwidget


【解决方案1】:

当一个项目被点击时,它也会被选中,所以只需使用最后一个功能。

一种可能的解决方案是创建一个新令牌,用于传输所选项目中的克隆项目,然后将其添加到另一个 QListWidget。

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


class MainWindow(QMainWindow):
    custom_signal = pyqtSignal(list)

    def __init__(self):
        super().__init__()
        self.user_input = QListWidget(selectionMode=QAbstractItemView.ExtendedSelection)
        self.user_input.addItem("2")
        self.user_input.addItem("3")
        self.populate()

        self.user_input.itemSelectionChanged.connect(self.handle_selection_changed)

    def populate(self):
        widgets = [QLabel("Insert a number"), self.user_input]
        centralWidget = self.group_widgets(widgets)
        self.setCentralWidget(centralWidget)

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

    def handle_selection_changed(self):
        items = []
        for item in self.user_input.selectedItems():
            items.append(item.clone())
        self.custom_signal.emit(items)


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

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

    def get_widgets(self):
        widgets = [
            QLabel("Inserted number"),
            self.user_input,
        ]
        return widgets

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

    def add_items(self, items):
        for item in items:
            self.user_input.addItem(item)


def main():
    app = QApplication([])

    mainWindow = MainWindow()
    mainWindow.show()

    dialog = Dialog()
    dialog.show()

    mainWindow.custom_signal.connect(dialog.add_items)

    app.exec_()


if __name__ == "__main__":
    main()

【讨论】:

    猜你喜欢
    • 2011-06-15
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    相关资源
    最近更新 更多