PyQt beginremoverows - PullRequest
       22

PyQt beginremoverows

3 голосов
/ 11 февраля 2010

В приведенном ниже примере:

from PyQt4 import QtCore, QtGui

class Ui_Dialog(QtGui.QDialog):

    def __init__(self,parent=None):
        QtGui.QDialog.__init__(self,parent)
        self.setObjectName("Dialog")
        self.resize(600, 500)

        self.model = QtGui.QDirModel()
        self.tree = QtGui.QTreeView()
        self.tree.setModel(self.model)
        print(self.model.flags(self.model.index("c:\Program Files")))
        self.model.setFilter(QtCore.QDir.Dirs|QtCore.QDir.NoDotAndDotDot)

        self.tree.setSortingEnabled(True)

        self.tree.setRootIndex(self.model.index("c:\Program Files"))

        #self.tree.hideColumn(1)
        #self.tree.hideColumn(2)
        #self.tree.hideColumn(3)
        self.tree.setWindowTitle("Dir View")
        self.tree.resize(400, 480)
        self.tree.setColumnWidth(0,200)

        self.tree.show()
        QtCore.QObject.connect(self.tree, QtCore.SIGNAL("clicked(QModelIndex)"), self.test)
        QtCore.QMetaObject.connectSlotsByName(self)

        self.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))

    def test(self,index):

        print(self.model.filePath(index))

        print(self.model.rowCount(index))
         #self.model.beginRemoveRows(index.parent(),index.row(),self.model.rowCount(index))
        #self.model.endRemoveRows()

        print("Row of the index =",index.row())

        print("Parent = ",self.model.data(index.parent()))

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    ui = Ui_Dialog()
    #ui.show()
    sys.exit(app.exec_())

Я хочу удалить строку и ее дочерние элементы (если они есть) при нажатии на нее.
(Папка под кликом, и ее дети должны быть удалены.)

Я знаю, что я ошибаюсь в этой строке:

self.model.beginRemoveRows(index.parent(),index.row(),self.model.rowCount(index))

Спасибо за ваше время.

Ответы [ 3 ]

3 голосов
/ 11 февраля 2010

Я знаю, что ошибаюсь строка:

self.model.beginRemoveRows(index.parent(),index.row(),self.model.rowCount(index))

Да, вы правы. Давайте посмотрим на то, что вы передаете:

index.parent() - the parent of index
index.row() - the row number of index, the row you want deleted
self.model.rowCount(index) - the number of total children had by index

Теперь взгляните на изображение в документации по beginRemoveRows :

Вы сказали, что хотите удалить из index.row() строку, равную количеству детей по индексу. Ваше несоответствие вашим индексам родитель-ребенок.

То, что вы действительно хотели, было:

beginRemoveRows(index.parent(), index.row(), index.row())

Если вы удалите строку в index.row(), , все ее дочерние элементы будут удалены автоматически .

НО , есть большая проблема: beginRemoveRows() не НЕ удаляет все строки. Он просто предупреждает вашу модель, что вы собираетесь удалять строки. Когда вы звоните endRemoveRows(), модель сообщит всем слушающим, что она была обновлена, поэтому они могут правильно перерисовать.

В C ++ вам не разрешено вызывать beginRemoveRows(), потому что они являются защищенными методами, которые должна вызывать только модель.

Чтобы выполнить фильтрацию по своему усмотрению, вам необходимо создать собственную модель прокси (т.е. QSortFilterProxyModel ), которая выполняет необходимую фильтрацию. Затем вы будете манипулировать моделью QSortFilterProxy в ответ на ваш обработчик сигнала.

0 голосов
/ 23 февраля 2010

Спасибо, jcoon и kaleb. Я спрятал строку, используя функцию setRowHidden () из древовидного списка.

0 голосов
/ 11 февраля 2010

Jebagnanadas - я рекомендую немного изменить свой дизайн; вместо использования пользовательского интерфейса в качестве модели и создайте отдельные объекты для представления того, что находится в TreeView, а затем обновите эти объекты и перестройте / обновите TreeView.

Ваш метод test() должен просто удалить выбранные объекты из переменной-члена, а затем вызвать метод refresh() (который вам нужно написать), который очистит TreeView и перестроит его, используя обновленную переменную-член.

С этим дизайном гораздо приятнее работать, потому что он отделяет пользовательский интерфейс от вашей модели, и вам не нужно беспокоиться о том, чтобы иметь дело с большим количеством методов QT, чем нужно.

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