如何自动拉伸QTableView列并使它们可调 [英] How to auto stretch QTableView columns and keep them being adjustable

查看:735
本文介绍了如何自动拉伸QTableView列并使它们可调的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我真的很喜欢使用以下方法自动调整为列的QTableView列宽度的清晰结果:

I really like a clean result of self-adjusting to the QTableView's width of the columns using:

self.view.horizontalHeader().setResizeMode(QHeaderView.Stretch)

但是不幸的是,使用此标志后,列宽不再保持可调(用户无法调整列宽的大小).

But unfortunately with this flag used the columns width doesn't stay adjustable any longer (the user is not able to resize the columns width).

我想知道是否还有另一种方法可以将列宽设置为QTableView的宽度,同时又将列宽保持为用户可调"?

I wonder if there is an alternative way to set the columns width to the width of the QTableView and yet keeping the columns width "user-adjustable"?

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

class Model(QAbstractTableModel):
    def __init__(self, parent=None, *args):
        QAbstractTableModel.__init__(self, parent, *args)
        self.items = ['Item_A_001','Item_A_002','Item_B_001','Item_B_002']
        self.totalColumn=10

    def rowCount(self, parent=QModelIndex()):
        return len(self.items)       
    def columnCount(self, parent=QModelIndex()):
        return self.totalColumn
    def setColumnCount(self, number):
        self.totalColumn=number
        self.reset()

    def data(self, index, role):
        if not index.isValid(): return QVariant()
        elif role != Qt.DisplayRole:
            return QVariant()

        row=index.row()
        if row<len(self.items):
            return QVariant(self.items[row])
        else:
            return QVariant()


class MyWindow(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)

        tableModel=Model(self)               

        self.view=QTableView(self) 
        self.view.setModel(tableModel)
        self.view.horizontalHeader().setResizeMode(QHeaderView.Stretch)

        hideButton=QPushButton('Hide Column')
        hideButton.clicked.connect(self.hideColumn)

        unhideButton=QPushButton('Unhide Column')
        unhideButton.clicked.connect(self.unhideColumn)

        layout = QVBoxLayout(self)
        layout.addWidget(self.view)
        layout.addWidget(hideButton)
        layout.addWidget(unhideButton)
        self.setLayout(layout)

    def hideColumn(self):
        self.view.model().setColumnCount(1)

    def unhideColumn(self):
        self.view.model().setColumnCount(10)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())

推荐答案

所以这是我想到的一个小技巧.我修改了MyWindow的resize事件,以调整QTableWidget的大小.

so here is a little trick I came up with. I modified the resize event of MyWindow to resize your QTableWidget.

class MyWindow(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)

        self.tableModel=Model(self) #Set the model as part of your class to access it in the event handler               

        self.view=QTableView(self) 
        self.view.setModel(self.tableModel) #Modified here too
        self.view.horizontalHeader().setResizeMode(QHeaderView.Interactive) #Mode set to Interactive to allow resizing

    hideButton=QPushButton('Hide Column')
    hideButton.clicked.connect(self.hideColumn)

    unhideButton=QPushButton('Unhide Column')
    unhideButton.clicked.connect(self.unhideColumn)

    layout = QVBoxLayout(self)
    layout.addWidget(self.view)
    layout.addWidget(hideButton)
    layout.addWidget(unhideButton)
    self.setLayout(layout)

    def hideColumn(self):
        self.view.model().setColumnCount(1)

    def unhideColumn(self):
        self.view.model().setColumnCount(10)

    #Added a reimplementation of the resize event
    def resizeEvent(self, event):
        tableSize = self.view.width() #Retrieves your QTableView width
        sideHeaderWidth = self.view.verticalHeader().width() #Retrieves the left header width
        tableSize -= sideHeaderWidth #Perform a substraction to only keep all the columns width
        numberOfColumns = self.tableModel.columnCount() #Retrieves the number of columns

        for columnNum in range( self.tableModel.columnCount()): #For each column
            self.view.setColumnWidth(columnNum, int(tableSize/numberOfColumns) ) #Set the width = tableSize / nbColumns
        super(MyWindow, self).resizeEvent(event) #Restores the original behaviour of the resize event

唯一的不足是滚动条在滑动.我认为可以通过一些调整来解决.

The only downfall is that the scrollbar is flicking. I think this can be solved with some adjustment.

更新: 调整大小时外观更加整洁,不再滑动,禁用了滚动条.

Update: Get a cleaner look when resizing, no more flicking, disabled the scrollbar.

修改后的QTableView初始化:

Modified initialization of the QTableView:

self.view=QTableView(self) 
self.view.setModel(self.tableModel)
self.view.horizontalHeader().setResizeMode(QHeaderView.Interactive)
#Added these two lines
self.view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.view.horizontalHeader().setStretchLastSection(True)

修改后的resizeEvent:

Modified resizeEvent:

def resizeEvent(self, event):
    super(MyWindow, self).resizeEvent(event)
    tableSize = self.view.width()
    sideHeaderWidth = self.view.verticalHeader().width()
    tableSize -= sideHeaderWidth
    numberOfColumns = self.tableModel.columnCount()

    remainingWidth = tableSize % numberOfColumns 
    for columnNum in range( self.tableModel.columnCount()):
        if remainingWidth > 0:
            self.view.setColumnWidth(columnNum, int(tableSize/numberOfColumns) + 1 )
            remainingWidth -= 1
        else:
            self.view.setColumnWidth(columnNum, int(tableSize/numberOfColumns) )

这篇关于如何自动拉伸QTableView列并使它们可调的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆