繁体   English   中英

如何使用委托来控制QTableView的行高

[英]How to use Delegate to control QTableView's rows height

此代码创建一个QTableView并将QSpinBoxes设置为其委托项目。 我想根据此处描述的技术使用SpinBoxDelegatesizeHint()方法返回固定的QSize(64,64)调整QTableView行的高度

不幸的是,指定的QSize(64,64)仅返回单个行#1(?)。 为什么不是每一行都发生呢? 代码中的错误在哪里?

在此处输入图片说明

import sip
sip.setapi('QVariant', 2)

from PyQt4.QtCore import *
from PyQt4.QtGui import *


class SpinBoxDelegate(QItemDelegate):
    def createEditor(self, parent, option, index):
        editor = QSpinBox(parent)
        editor.setMinimum(0)
        editor.setMaximum(100)

        return editor

    def setEditorData(self, spinBox, index):
        value = index.model().data(index, Qt.EditRole)

        spinBox.setValue(value)

    def setModelData(self, spinBox, model, index):
        spinBox.interpretText()
        value = spinBox.value()

        model.setData(index, value, Qt.EditRole)

    def updateEditorGeometry(self, editor, option, index):
        print option
        editor.setGeometry(option.rect)
    def sizeHint(self, option, index):
        print 'sizeHint', index.row(), index.column()
        return QSize(64,64)

if __name__ == '__main__':

    import sys

    app = QApplication(sys.argv)

    model = QStandardItemModel(4, 2)
    tableView = QTableView()
    tableView.setModel(model)

    delegate = SpinBoxDelegate()
    tableView.setItemDelegate(delegate)

    for row in range(4):
        for column in range(2):
            index = model.index(row, column, QModelIndex())
            model.setData(index, (row + 1) * (column + 1))

    tableView.resizeRowToContents(True)

    tableView.show()
    sys.exit(app.exec_())

错误是使用tableView.resizeRowToContents(True)而不是tableView.resizeRowsToContents()来更新所有当前可见的QModelIndexes。 固定代码如下:

在此处输入图片说明

import sip
sip.setapi('QVariant', 2)

from PyQt4.QtCore import *
from PyQt4.QtGui import *


class SpinBoxDelegate(QItemDelegate):
    def createEditor(self, parent, option, index):
        editor = QSpinBox(parent)
        editor.setMinimum(0)
        editor.setMaximum(100)

        return editor

    def setEditorData(self, spinBox, index):
        value = index.model().data(index, Qt.EditRole)

        spinBox.setValue(value)

    def setModelData(self, spinBox, model, index):
        spinBox.interpretText()
        value = spinBox.value()

        model.setData(index, value, Qt.EditRole)

    def updateEditorGeometry(self, editor, option, index):
        print option
        editor.setGeometry(option.rect)
    def sizeHint(self, option, index):
        print 'sizeHint', index.row(), index.column()
        return QSize(64,64)

if __name__ == '__main__':

    import sys

    app = QApplication(sys.argv)

    model = QStandardItemModel(4, 2)
    tableView = QTableView()
    tableView.setModel(model)

    delegate = SpinBoxDelegate()
    tableView.setItemDelegate(delegate)

    for row in range(4):
        for column in range(2):
            index = model.index(row, column, QModelIndex())
            model.setData(index, (row + 1) * (column + 1))

    tableView.resizeRowsToContents()

    tableView.show()
    sys.exit(app.exec_())

或者这是相同概念的基本版本:

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class ForSizeOnlyDelegate(QItemDelegate):
    def sizeHint(self, option, index):
        print 'sizeHint', index.row(), index.column()
        return QSize(64,64)

if __name__ == '__main__':
    app = QApplication(sys.argv)

    model = QStandardItemModel(14, 12)
    tableView = QTableView()
    tableView.setModel(model)

    delegate = ForSizeOnlyDelegate()

    tableView.setItemDelegate(delegate)
    tableView.resizeRowsToContents()

    tableView.show()
    sys.exit(app.exec_())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM