【问题标题】:How to use Delegate to control QTableView's rows height如何使用 Delegate 控制 QTableView 的行高
【发布时间】:2023-03-14 13:01:02
【问题描述】:

此代码创建一个QTableView,并将QSpinBoxes 设置为其委托项。我想根据此处描述的技术使用SpinBoxDelegatesizeHint() 方法返回一个固定的QSize(64,64)Adjusting the height of a QTableView Row

不幸的是,指定的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_())

【问题讨论】:

    标签: python qt model pyqt qtableview


    【解决方案1】:

    错误是使用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_())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 2020-07-31
      • 2015-03-16
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      相关资源
      最近更新 更多