2017-04-24 58 views
0

我的項目涉及兩個完全相同項目的獨立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_()) 

回答

2

兩個列表共享同一個項目是一個很好的用例使用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

相關問題