2010-11-18 4 views
1

Доброго времени суток всем,освежающего QTreeView/QSortFilterProxyModel

писал код в течение многих лет, но все еще немного зеленые, когда речь идет о PyQt, поэтому, пожалуйста, простите мой синтаксический недостающий вопрос (ы) ;-)

Я хакерство производной (известный?) упакованный пример, который поставляется с PyQt4 (и Qt), а именно "basicsortfiltermodel.pyw" от "../examples/itemviews" в PyQt4 ...

Я добавил небольшое всплывающее меню (давайте назовем это B.py), что можно запустить от производного BasicSort (назовем это A.py).

Я считаю, что исправляю добавление новых данных (новой записи) в QSortFilterProxyModel(). (Я думаю, это потому, что я не получаю каких-либо ошибок сейчас, после некоторых усилий). Но я, похоже, не могу получить QTreeView для обновления. Я рыскал документацию класса Qt и Google'd черт из него (похоже на общий вопрос взглядов его, лол) ..

Теперь я знаю, что это некрасиво хак, но только чтобы попытаться заставить его работать (элегантность может прийти позже моя теория) ... в нижней части A.py, я объявил глобальную «WX»,

global wX; 

[...] 
window = Window() 
wX = Window() 
window.setSourceModel(createMailModel(window)) 

так, что когда я ударил позже, я мог бы более легко получить удержание «родительского» значения, найденного в среде выполнения «createMailModel». Из которого я получаю «модель» ручку ..

model = QtGui.QStandardItemModel(0, 17, WinX) 

    addMail(model, "image", 
          "tabl00", 
          etc 
          etc) 

В любом случае, .. Я думаю, что это работает .... Но после добавления новой записи с помощью addMail(), я не могу получить self.proxyModel, чтобы обновить себя ..

Я уверен, что это глупый вопрос новичка, лол .... но может кто-нибудь помочь пролить свет на то, как сделать эту работу?

Большое спасибо,

ответ

2

Я считаю, вы должны добавить новые элементы в исходной модели не прокси один. Когда элементы будут добавлены, прокси-модель и представление соответственно обновятся. Смотрите, если пример ниже будет работать для вас:

import sys 
from PyQt4 import QtGui 

class MainForm(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainForm, self).__init__(parent) 

     self.setMinimumSize(300, 400) 

     self.model = QtGui.QStandardItemModel() 
     self.sortModel = QtGui.QSortFilterProxyModel() 
     self.sortModel.setSourceModel(self.model) 

     parentItem = self.model.invisibleRootItem() 
     parentItem.appendRow(QtGui.QStandardItem("3")) 
     parentItem.appendRow(QtGui.QStandardItem("1")) 
     parentItem.appendRow(QtGui.QStandardItem("4")) 
     parentItem.appendRow(QtGui.QStandardItem("2")) 

     self.view = QtGui.QListView(self) 
     self.view.setModel(self.sortModel) 
     self.view.setGeometry(0, 0, 200, 400) 

     self.button = QtGui.QPushButton("add items", self) 
     self.button.move(200, 0) 
     self.button.clicked.connect(self.on_button_clicked) 

     self.layout = QtGui.QVBoxLayout(self.centralWidget())   
     self.layout.addWidget(self.view) 
     self.layout.addWidget(self.button) 

     self.sortModel.sort(0) 

    def on_button_clicked(self): 
     parentItem = self.model.invisibleRootItem() 
     parentItem.appendRow(QtGui.QStandardItem("222")) 
     parentItem.appendRow(QtGui.QStandardItem("333")) 
     parentItem.appendRow(QtGui.QStandardItem("444")) 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    form = MainForm() 
    form.show() 
    app.exec_() 

if __name__ == '__main__': 
    main() 

надеюсь, что это помогает, считает

+0

Да, он уверен, делает ... Большое спасибо, Сережа! ;-) – Coleslaw

+0

кричит, ... хит быстро возвращается ... извинения ... – Coleslaw

Смежные вопросы