关于python:PyQt:如何调整QTableView标头大小/列宽

部署运行你感兴趣的模型镜像

步骤1:我必须继承QHeaderView类并重写resizeEvent()函数,我从这里得到了它,但是他正在重写TableView的函数,而我是针对HeaderView编写的。

步骤2:然后,我将headerview的sectionResized连接到新函数以处理列的大小调整。 我希望能够在保持总宽度不变的情况下调整特定列的大小,做到这一点,当我缩小一列时,我将下一列以相同的数量扩展,反之亦然。 我以为我不需要执行步骤2,但是事实证明这是必要的。

在这个工作示例下面,我添加了一个水平拆分器,以便您可以尝试使用表调整大小功能。

import sys
from PyQt5 import QtWidgets
from PyQt5.QtCore import QAbstractTableModel, Qt, QVariant

class TableModel(QAbstractTableModel):
    def __init__(self, parent, datain, headerdata):
        QAbstractTableModel.__init__(self, parent)

        self.arraydata=datain
        self.headerdata=headerdata

    def rowCount(self,p):
        return len(self.arraydata)

    def columnCount(self,p):
        if len(self.arraydata)>0:
            return len(self.arraydata[0])
        return 0

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

    def headerData(self, col, orientation, role):
        if orientation==Qt.Horizontal and role==Qt.DisplayRole:
            return self.headerdata[col]
        return None

class MyHeaderView(QtWidgets.QHeaderView):
    def __init__(self,parent):
        QtWidgets.QHeaderView.__init__(self,Qt.Horizontal,parent)
        self.sectionResized.connect(self.myresize)

    def myresize(self, *args):
        '''Resize while keep total width constant'''

        # keep a copy of column widths
        ws=[]
        for c in range(self.count()):
            wii=self.sectionSize(c)
            ws.append(wii)

        if args[0]>0 or args[0]<self.count():
            for ii in range(args[0],self.count()):
                if ii==args[0]:
                    # resize present column
                    self.resizeSection(ii,args[2])
                elif ii==args[0]+1:
                    # if present column expands, shrink the one to the right
                    self.resizeSection(ii,ws[ii]-(args[2]-args[1]))
                else:
                    # keep all others as they were
                    self.resizeSection(ii,ws[ii])

    def resizeEvent(self, event):
       """Resize table as a whole, need this to enable resizing"""

        super(QtWidgets.QHeaderView, self).resizeEvent(event)
        self.setSectionResizeMode(1,QtWidgets.QHeaderView.Stretch)
        for column in range(self.count()):
            self.setSectionResizeMode(column, QtWidgets.QHeaderView.Stretch)
            width = self.sectionSize(column)
            self.setSectionResizeMode(column, QtWidgets.QHeaderView.Interactive)
            self.resizeSection(column, width)

        return

class MainFrame(QtWidgets.QWidget):

    def __init__(self):
        super(MainFrame,self).__init__()
        self.initUI()

    def initUI(self):

        self.doc_table=self.createTable()
        dummy_box=QtWidgets.QLineEdit()

        hlayout=QtWidgets.QHBoxLayout()
        h_split=QtWidgets.QSplitter(Qt.Horizontal)
        h_split.addWidget(self.doc_table)
        h_split.addWidget(dummy_box)
        hlayout.addWidget(h_split)
        self.setLayout(hlayout)
        self.show()

    def createTable(self):
        # create some dummy data
        self.tabledata=[['aaa' ,' title1', True, 1999],
                    ['bbb' ,' title2', True, 2000],
                    ['ccc' ,' title3', False, 2001]
                    ]
        header=['author', 'title', 'read', 'year']

        tablemodel=TableModel(self,self.tabledata,header)
        tv=QtWidgets.QTableView(self)
        hh=MyHeaderView(self)
        tv.setHorizontalHeader(hh)
        tv.setModel(tablemodel)
        tv.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
        tv.setShowGrid(True)

        hh.setSectionsMovable(True)
        hh.setStretchLastSection(False)
        # this may be optional:
        #hh.setSectionResizeMode(QtWidgets.QHeaderView.Stretch)

        return tv


class MainWindow(QtWidgets.QMainWindow):

    def __init__(self):
        super(MainWindow,self).__init__()

        self.main_frame=MainFrame()
        self.setCentralWidget(self.main_frame)
        self.setGeometry(100,100,800,600)
        self.show()


if __name__=='__main__':

    app=QtWidgets.QApplication(sys.argv)
    mainwindow=MainWindow()
    sys.exit(app.exec_())

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我现在需要帮助用户解决如何在PyQt5QTableView中实现自动调整的功能。用户已经提供了一些相关的引用内容,我需要结合这些信息和之前的知识来给出准确的回答。 首先,用户提到了引用[1]和引用[2],其中引用[2]详细出了调整的几种方法,比如setColumnWidth、resizeColumnToContents等。用户现在想知道如何实现自动调整,也就是让表格的根据内容自动调整,可能还要考虑表的适应。 回顾之前的回答,用户之前的问题是关于在后台线程中执行计算并更新表格模型,所以当前的回答需要专注于视图的调整,而不涉及模型的数据更新部分。因此,我需要确保回答集中在QTableView调整方法上。 根据引用[2],调整的方法包括: 1. resizeColumnToContents(int column):调整某一为内容宽度。 2. resizeColumnsToContents():调整所有为内容宽度。 3. setColumnWidth(int column, int width):手动设置。 用户的需求是自动调整,所以重点应该放在resizeColumnsToContents方法上。但可能需要结合其他设置,比如设置拉伸模式或者表交互。 另外,用户引用[1]提到在调整时保持总宽度不变,可能需要通过信号连接来处理,但用户现在的问题是关于自动调整,所以可能不需要这部分,但需要确认是否需要考虑用户调整后的自动适应。 接下来,我需要组织回答的结构,分步骤说明如何实现自动调整。可能包括: 1. 基本自动调整方法:使用resizeColumnsToContents。 2. 结合表拉伸模式,比如设置水平表的拉伸模式为Stretch或ResizeToContents。 3. 初始化和数据变化时的处理,比如在模型数据更新后自动调整。 4. 高级技巧,比如设置最小或比例调整。 需要确保代码示例正确,并符合PyQt5的语法,比如正确使用QTableView的方法,设置水平部的属性等。 同时,用户可能需要知道不同方法的区别,比如Stretch和ResizeToContents的不同效果,以及何时使用哪种方法。例如,ResizeToContents会根据内容调整,而Stretch会平均分配空间,但可能覆盖内容调整的结果。 另外,要提到注意事项,比如性能问题,当数据量很大时,频繁调整可能会影响性能,所以建议在数据加载完成后一次性调整。 最后,生成相关问题,帮助用户进一步了解相关主题,比如调整行高、处理大量数据时的优化等。 总结,回答需要覆盖多种方法,给出示例代码,并解释不同方法的使用场景和注意事项,确保用户能够根据需求选择合适的方式。</think>以下是在PyQt5中实现$QTableView$自动调整的4种核心方法,根据实际需求选择使用场景: ### 一、基础内容自适应(推荐) ```python # 创建视图后直接调用 table_view = QTableView() table_view.resizeColumnsToContents() # 自动调整所有到内容宽度[^2] # 针对特定调整 table_view.resizeColumnToContents(0) # 只调整第1宽度[^2] ``` ### 二、表拉伸模式组合 ```python # 设置水平表属性 header = table_view.horizontalHeader() # 模式1:自动拉伸到可用空间 header.setSectionResizeMode(QHeaderView.Stretch) # 所有平分可用宽度 # 模式2:交互式+自动调整(最优组合) header.setSectionResizeMode(QHeaderView.Interactive) # 允许手动调整 header.setSectionResizeMode(0, QHeaderView.ResizeToContents) # 第1保持内容自适应 # 模式3:完全自适应内容 header.setSectionResizeMode(QHeaderView.ResizeToContents) # 所有自动适应内容[^2] ``` ### 三、动态调整策略 ```python # 模型数据更新时自动调整 class CustomModel(QAbstractTableModel): def dataChanged(self, topLeft, bottomRight, roles): super().dataChanged(topLeft, bottomRight, roles) self.layoutChanged.emit() # 触发视图更新 # 连接模型信号 model = CustomModel() model.layoutChanged.connect(lambda: table_view.resizeColumnsToContents()) ``` ### 四、高级比例调整 ```python # 设置初始比例 header = table_view.horizontalHeader() header.setStretchLastSection(True) # 最后一填满剩余空间 # 设置最小限制 header.setMinimumSectionSize(100) # 所有最小宽度100px header.setDefaultSectionSize(150) # 默认宽度150px ``` ### 方法对比表 | 方法 | 特点 | 适用场景 | |--------------------|-----------------------------|-------------------------| | resizeColumnsToContents | 立即生效,精确计算内容宽度 | 数据量小的静态表格 | | ResizeToContents模式 | 动态自适应,自动响应内容变化 | 频繁更新的实时数据 | | Stretch模式 | 保持表格总宽度填满容器 | 需要界面整洁的布局 | | Interactive+Resize | 混合手动调整与自动适应 | 需要用户交互的复杂表格 | ### 注意事项 1. 性能优化:对超过1000行的数据集慎用`ResizeToContents`,建议改用`setColumnWidth`手动设置固定宽度[^2] 2. 信号处理:避免在`data()`方法中调用调整方法,会导致递归调用 3. 视觉优化:结合`setTextElideMode(Qt.ElideRight)`实现文本省略,提升显示效果 ```python # 完整示例 table_view = QTableView() table_view.setModel(data_model) table_view.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents) table_view.horizontalHeader().setStretchLastSection(True) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值