gpt4 book ai didi

QTableView 标题自动换行

转载 作者:行者123 更新时间:2023-12-04 13:32:10 30 4
gpt4 key购买 nike

我正在尝试将 QTableView 中的水平和垂直标题设置为自动换行,但没有任何成功。

我想将所有列设置为相同的宽度(包括垂直标题),以及那些多行文本要自动换行的列。如果单词比列宽,它应该向右省略。
我已经设法使用 QTableView -> horizo​​ntalHeader() -> setTextElideMode(Qt::ElideRight) 设置了 elide,但是由于 QHeaderView 没有 setWordWrap 方法,所以我不能对自动换行做同样的事情。因此,如果文本是多行的,它只会省略。在表格 View 上设置自动换行没有任何作用。表格单元格仅包含少量数字,因此问题仅在于标题,我想避免使用 '/n',因为标题是动态设置的。我是否更改了一些其他设置,不允许自动换行?

最佳答案

我设法使用 QHeaderView 的子类化并在其中重新实现 sectionSizeFromContentspaintSection 方法找到了解决方案。这是 PyQt5 中的演示(使用 Python 3.5.2 和 Qt 5.6 测试):

import sys
import string
import random
from PyQt5 import QtCore, QtWidgets, QtGui

class HeaderViewWithWordWrap(QtWidgets.QHeaderView):
def __init__(self):
QtWidgets.QHeaderView.__init__(self, QtCore.Qt.Horizontal)

def sectionSizeFromContents(self, logicalIndex):
if self.model():
headerText = self.model().headerData(logicalIndex,
self.orientation(),
QtCore.Qt.DisplayRole)
options = self.viewOptions()
metrics = QtGui.QFontMetrics(options.font)
maxWidth = self.sectionSize(logicalIndex)
rect = metrics.boundingRect(QtCore.QRect(0, 0, maxWidth, 5000),
self.defaultAlignment() |
QtCore.Qt.TextWordWrap |
QtCore.Qt.TextExpandTabs,
headerText, 4)
return rect.size()
else:
return QtWidgets.QHeaderView.sectionSizeFromContents(self, logicalIndex)

def paintSection(self, painter, rect, logicalIndex):
if self.model():
painter.save()
self.model().hideHeaders()
QtWidgets.QHeaderView.paintSection(self, painter, rect, logicalIndex)
self.model().unhideHeaders()
painter.restore()
headerText = self.model().headerData(logicalIndex,
self.orientation(),
QtCore.Qt.DisplayRole)
painter.drawText(QtCore.QRectF(rect), QtCore.Qt.TextWordWrap, headerText)
else:
QtWidgets.QHeaderView.paintSection(self, painter, rect, logicalIndex)

class Model(QtCore.QAbstractTableModel):
def __init__(self):
QtCore.QAbstractTableModel.__init__(self)
self.model_cols_names = [ "Very-very long name of my first column",
"Very-very long name of my second column",
"Very-very long name of my third column",
"Very-very long name of my fourth column" ]
self.hide_headers_mode = False
self.data = []
for i in range(0, 10):
row_data = []
for j in range(0, len(self.model_cols_names)):
row_data.append(''.join(random.choice(string.ascii_uppercase +
string.digits) for _ in range(6)))
self.data.append(row_data)

def hideHeaders(self):
self.hide_headers_mode = True

def unhideHeaders(self):
self.hide_headers_mode = False

def rowCount(self, parent):
if parent.isValid():
return 0
else:
return len(self.data)

def columnCount(self, parent):
return len(self.model_cols_names)

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

row = index.row()
if row < 0 or row >= len(self.data):
return None

column = index.column()
if column < 0 or column >= len(self.model_cols_names):
return None

return self.data[row][column]

def headerData(self, section, orientation, role):
if role != QtCore.Qt.DisplayRole:
return None
if orientation != QtCore.Qt.Horizontal:
return None
if section < 0 or section >= len(self.model_cols_names):
return None
if self.hide_headers_mode == True:
return None
else:
return self.model_cols_names[section]

class MainForm(QtWidgets.QMainWindow):
def __init__(self, parent=None):
QtWidgets.QMainWindow.__init__(self, parent)
self.model = Model()
self.view = QtWidgets.QTableView()
self.view.setModel(self.model)
self.view.setHorizontalHeader(HeaderViewWithWordWrap())
self.setCentralWidget(self.view)

def main():
app = QtWidgets.QApplication(sys.argv)
form = MainForm()
form.show()
app.exec_()

if __name__ == '__main__':
main()

关于QTableView 标题自动换行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45084542/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com