python - QTableWidget 在调整内容时尊重跨度
问题描述
如果我有QTableWidget
,并且我使用 设置单元格的列跨度setSpan
,Qt 会调整表格的大小,就好像单元格的内容完全在扩展单元格的第一列中一样。
from PyQt5 import QtWidgets, QtCore
import sys
class myMainWindow(QtWidgets.QMainWindow):
def __init__(self):
super(myMainWindow, self).__init__()
tableBoxWidget = QtWidgets.QWidget(self)
tableBox = QtWidgets.QHBoxLayout(tableBoxWidget)
self.setCentralWidget(tableBoxWidget)
self.setMinimumWidth(750)
tableBoxWidget.setContentsMargins(20,20,20,20)
testTable = QtWidgets.QTableWidget(tableBoxWidget)
tableBox.addWidget(testTable)
testTable.setFocusPolicy(QtCore.Qt.NoFocus)
testTable.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection)
testTable.setRowCount(3)
testTable.setColumnCount(2)
# setting column 1 resize to contents
testTable.horizontalHeader().setStretchLastSection(False)
testTable.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)
longString = "abcdefghijklmnopqrstuvwxyz"
shortString = "abc"
#first row
testTable.setItem(0, 0, QtWidgets.QTableWidgetItem(shortString))
testTable.setItem(0, 1, QtWidgets.QTableWidgetItem(longString))
#second row, two-column span
testTable.setSpan(1, 0, 1, 2)
testTable.setItem(1, 0, QtWidgets.QTableWidgetItem(longString))
#third row, same as first
testTable.setItem(2, 0, QtWidgets.QTableWidgetItem(shortString))
testTable.setItem(2, 1, QtWidgets.QTableWidgetItem(longString))
self.show()
app = QtWidgets.QApplication(sys.argv)
window = myMainWindow()
app.exec_()
但是有没有办法强制 Qt 考虑跨单元格提供的额外空间?
解决方案
我遇到了很多麻烦,我无法为我的表格项目获取有效的 sizeHints,并且用于获取项目大小的 QTableVeiew 方法在 Qt 源代码中似乎是私有的。因此,这排除了根据单个项目的宽度调整列的大小(即忽略/考虑跨项目)。
一种解决方法是隐藏存在导致问题的跨区项目的任何行,调整为内容大小,然后再次显示它们。这需要您知道哪些行包含跨区项目(对我来说这很容易,因为它始终是第一行)。
self.setRowHidden(0, True)
for col in range(self.columnCount()):
self.resizeColumnToContents(col)
self.setRowHidden(0, False)
其中 self 是一个 QTableWidget
推荐阅读
- jquery - 光滑的 js 使光滑的幻灯片增长以匹配父兄弟的高度
- regex - 使用正则表达式从具有特殊模式的文本中提取第一行
- swift - 如何修复致命错误:索引超出范围
- node.js - 如何在 paypal node.js 中获取交易 ID 反应?
- javascript - “UnhandledPromiseRejectionWarning:DiscordAPIError:缺少权限”
- assembly - 使用 Rust 内联汇编时奇怪的机器代码字节顺序
- javascript - 如何在图标后将光标定位在输入字段中
- ios - 在推送消息打开崩溃 iOS
- javascript - 了解 blob url 视频流
- javascript - 当电流等于开始时间时如何将时间切换到不同的时间