2017-04-24 20 views
0

私のプロジェクトには、全く同じ項目を持つ2つの別々のQListWidgetsが含まれています。私のコードは最初のリストにアイテムを追加しますが、2番目のリストにはアイテムを追加できません。誰かが前にこれをしていなければならないが、検索結果は重複したアイテムを削除するためのものである。2つの別々のQListWidgetsに同じ項目を追加します

毎回新しいアイテムを作成せずに、1つのアイテムを2つの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

2つのリストに同じアイテムを共有するには、モデルを共有QListViewオブジェクトを、使用のために良いユースケースです。あなたが大規模なリストを持っている場合は、(QAbstractListModel由来)、独自のモデルクラスを実装するために検討すべきである

# -*- 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_()) 

:小さなリストでは、あなたはそうのように、 QStandardItemsが含まれている QStandardItemModelを、使用することができます。これには、すべてのリスト要素の項目クラスを事前に作成する必要がないため、パフォーマンスが大幅に向上するという利点があります。

あなたはQtのモデルビュープログラミングありhere

+0

の詳細を読むことができ、私は何かを学ぶことを知っていました。ありがとう!それはより良い方法のようです。好奇心のために、私のアイテムが両方のリストウィジェットに追加されないのはなぜですか? – jshort

+0

'QListWidgetItem'sは単一の' QListWidget'で使われるように設計されています(あなたは[reference](http://doc.qt.io/qt-4.8/qlistwidgetitem.html#listWidget)を項目から取得することもできますアイテムを含むリストウィジェットに)したがって、2つの 'QListWidgets'でそれを使用しようとすると、未定義の動作になります。私の投稿があなたの質問に答えるならBTWに答えてください。 – titusjan

+0

私の好奇心と答えの深さを満足させてくれてありがとう。答えられ、投票されたとマークされます。 – jshort

関連する問題