обновление QTreeView / QSortFilterProxyModel - PullRequest
2 голосов
/ 18 ноября 2010

Good Day to All,

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

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

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

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

Теперь я знаю, что это уродливый хак, но простопопытаться заставить его работать (элегантность может прийти позже - моя теория) ... В нижней части 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 обновить себя ..

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

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

1 Ответ

3 голосов
/ 20 ноября 2010

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

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()

надеюсь, это поможет, с уважением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...