将相同的项目添加到两个单独的QListWidgets中

问题描述:

我的项目涉及两个完全相同项目的独立QListWidgets。我的代码成功地将项目添加到第一个列表,但不是第二个。有人必须先完成此操作,但搜索结果是用于删除重复的项目。将相同的项目添加到两个单独的QListWidgets中

是否可以将一个项目添加到两个QListWidgets中,而无需每次创建新项目?我可以解决这个问题,但它似乎是一个学习的机会。

for item in listItems: 
    itm = QtWidgets.QListWidgetItem(item); 
    self.lstOne.addItem(itm); 
    self.lstTwo.addItem(itm);   #fills the first but not the second 

这里是所有代码:

# -*- coding: utf-8 -*- 

import sys 
from PyQt5 import QtWidgets 
from PyQt5.QtWidgets import (QWidget, QApplication, QListWidget) 

class Example(QWidget): 

    def __init__(self): 
     super().__init__() 
     self.initUI() 


    def initUI(self): 

     self.lstOne = QListWidget(self) 
     self.lstTwo = QListWidget(self) 
     self.lstTwo.move(0, 250) 

     listItems = ["one", "two", "three", "four"]  

     for item in listItems: 
      itm = QtWidgets.QListWidgetItem(item); 
      self.lstOne.addItem(itm); 
      self.lstTwo.addItem(itm);  #fills the first but not the second 


     self.setGeometry(300, 300, 500, 500) 
     self.show() 


if __name__ == '__main__': 

    app = QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 

两个列表共享同一个项目是一个很好的用例使用QListView对象,共享的典范。对于小的列表,你可以使用一个QStandardItemModel,其中包含QStandardItems,就像这样:

# -*- coding: utf-8 -*- 

import sys 
from PyQt5 import QtWidgets, QtGui 
from PyQt5.QtWidgets import (QWidget, QApplication, QListView) 

class Example(QWidget): 

    def __init__(self): 
     super().__init__() 
     self.initUI() 


    def initUI(self): 

     self.lstOne = QListView(self) 
     self.lstTwo = QListView(self) 
     self.lstTwo.move(0, 250) 

     model = QtGui.QStandardItemModel(parent=self) 

     listItems = ["one", "two", "three", "four"]  

     for item in listItems: 
      itm = QtGui.QStandardItem(item) 
      model.appendRow(itm) 

     self.lstOne.setModel(model) 
     self.lstTwo.setModel(model) 

     self.setGeometry(300, 300, 500, 500) 
     self.show() 


if __name__ == '__main__': 

    app = QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 

如果你有一个大名单,你应该考虑实现自己的模型类(从QAbstractListModel获得)。这样做的好处是你不需要预先为所有列表元素创建项目类,从而提供更好的性能。

您可以了解更多关于Qt的模型 - 视图编程here

+0

在那里,我知道我会学到一些东西。谢谢!这似乎是一个更好的方法。只是为了好奇,为什么我的物品没有被添加到两个列表小部件? – jshort

+0

由于'QListWidgetItem's被设计用于一个'QListWidget'中(你甚至可以从该项目中获得[reference](http://doc.qt.io/qt-4.8/qlistwidgetitem.html#listWidget)到包含该项目的列表小部件)。试图在两个'QListWidgets'中使用它会导致未定义的行为。顺便说一句,如果我的文章回答你的问题,然后请将其标记为已回答 – titusjan

+0

感谢您满足我的好奇心和答案的深度。标记为回答并投票。 – jshort