PyQt:如何调整 QTableView 标题大小/列宽
Posted
技术标签:
【中文标题】PyQt:如何调整 QTableView 标题大小/列宽【英文标题】:PyQt: How to adjust QTableView header-size/column-width 【发布时间】:2018-03-24 17:06:59 【问题描述】:我正在尝试按照link 中的说明设置标题大小或列宽。
问题是:
table.horizontalHeader().setStretchLastSection(True
) 可以,但不是最优的
self.produktKaufTb.setColumnWidth(1, 80)
self.produktKaufTb.horizontalHeader().setResizeMode(0, QHeaderView.Stretch)
返回“AttributeError: 'QHeaderView' 对象没有属性'setResizeMode'”
其他两个选项
.horizontalHeader().setSectionResizeMode(1)
或
.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
不允许用鼠标调整列的大小
如何在 PyQt5 中设置列宽?
【问题讨论】:
第二个选项:更改为:self.produktKaufTb.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch)
“设置”列宽是什么意思?您的意思是设置初始宽度、固定宽度、最小宽度还是具体是什么?
我插入了self.produktTb.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch)
,在我设置了包含标题并且继承自QAbstract 表的模型之后。我在表模型类中将标题设置为headers = ["Bezeichnung", "Preis","Anzahl"]
。但蟒蛇再次粉碎。主要问题是,不是应用程序使用此选项崩溃,而是 python 崩溃
【参考方案1】:
经过一番折腾,我想出了一个解决方案(可能不是最佳的,但希望能有所帮助)。
第 1 步:我必须继承 QHeaderView
类并重写 resizeEvent()
函数,我从 here 得到它,但他正在重写 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_())
【讨论】:
好的,排序问题已经解决here以上是关于PyQt:如何调整 QTableView 标题大小/列宽的主要内容,如果未能解决你的问题,请参考以下文章
滚动大型数据集时,PyQt QTableView 速度非常慢