Как заставить QListView изменять размеры своих элементов в соответствии с размером редактора - PullRequest
1 голос
/ 11 января 2011

У меня есть qlistview, редактирование которого производится в qtableview с помощью делегата. Когда появится qtableview, я бы хотел, чтобы qlistview изменил размер своей строки, чтобы он соответствовал всем qtableview. Вот код:

import sys
from PyQt4 import QtGui, QtCore

class MyDelegate(QtGui.QStyledItemDelegate):
    def createEditor(self, parent, option, index):
        mtview = QtGui.QTableView(parent)
        mtview.verticalHeader().setVisible(False)
        mtview.horizontalHeader().setVisible(False)
        mtmodel = QtGui.QStandardItemModel()
        mtview.setModel(mtmodel)
        return mtview
    def setEditorData(self, editor, modelindex):
        editor.parent().setMinimumSize(400,400)
        mtmodel = editor.model()
        for x in range(5):
            for y in range(5):
                mtmodel.setItem(x,y,QtGui.QStandardItem("%s, %s" % (x, y)))

class MyApp(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.resize(200, 200)
        self.listview = QtGui.QListView(self)
        self.listview.setGeometry(QtCore.QRect(0,0,200,200))
        self.listview.setItemDelegate(MyDelegate())
        listmodel = QtGui.QStandardItemModel()
        t = '123456789'
        for x in range(10):
            itemmodel=QtGui.QStandardItem(t)
            listmodel.appendRow(itemmodel)
        self.listview.setModel(listmodel)

def main():
    app = QtGui.QApplication(sys.argv)
    mw = MyApp()
    mw.show()
    app.exec_()

if __name__=="__main__":
    main()

1 Ответ

0 голосов
/ 12 января 2011

Виджет, который вы должны пытаться изменить, - это редактор, который, как говорится,

import sys
from PyQt4 import QtGui, QtCore

class MyDelegate(QtGui.QStyledItemDelegate):
    def createEditor(self, parent, option, index):
        mtview = QtGui.QTableView(parent)
        mtview.verticalHeader().setVisible(False)
        mtview.horizontalHeader().setVisible(False)
        mtmodel = QtGui.QStandardItemModel()
        mtview.setModel(mtmodel)
        return mtview

    def setEditorData(self, editor, modelindex):
        editor.resize(400,400)
        mtmodel = editor.model()
        for x in range(5):
            for y in range(5):
                mtmodel.setItem(x,y,QtGui.QStandardItem("%s, %s" % (x, y)))

class MyApp(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MyApp, self).__init__(parent)
        self.setMinimumSize(200, 200)
        self.listview = QtGui.QListView()
        self.listview.setItemDelegate(MyDelegate())
        listmodel = QtGui.QStandardItemModel()

        self.setCentralWidget(self.listview)
        t = '123456789'
        for x in range(10):
            itemmodel=QtGui.QStandardItem(t)
            listmodel.appendRow(itemmodel)
        self.listview.setModel(listmodel)

def main():
    app = QtGui.QApplication(sys.argv)
    mw = MyApp()
    mw.show()
    app.exec_()

if __name__=="__main__":
    main()

Другое дело, что с QMainWindow вы должны использовать setCentralWidget

...