问题描述
我按照应该完成的方式填充了 QTableWidget() :) 现在我遇到了 col span 的问题。
左图显示了每列的正确大小,右图是我在引入第一行“跨越”后得到的结果,这不是我想要的。
import sys
from PyQt5.QtWidgets import QMainWindow,QApplication,QWidget,QAction,QTableWidget,QTableWidgetItem,QVBoxLayout
class MakeStrip(QWidget):
def __init__(self,anno,mese):
super().__init__()
self.initUI(anno,mese)
def initUI(self,mese):
self.title = "MAMbo - Strips di '%s' '%s' "%(mese,anno)
self.setwindowTitle(self.title)
self.setGeometry(50,100,250,800)
MakeStrip.callTable(self,mese)
self.layout = QVBoxLayout()
self.layout.addWidget(self.tableWidget)
self.setLayout(self.layout)
# Show widget
self.show()
def callTable(self,mese):
anno = '2021'
self.alphamese = 'January'
# Create table
self.tableWidget = QTableWidget()
self.tableWidget.setRowCount(10)
self.tableWidget.setColumnCount(3)
self.tableWidget.horizontalHeader().setVisible(False)
header = self.tableWidget.horizontalHeader()
header.setSectionResizeMode(0,QtWidgets.QHeaderView.ResizetoContents)
header.setSectionResizeMode(1,QtWidgets.QHeaderView.ResizetoContents)
header.setSectionResizeMode(2,QtWidgets.QHeaderView.ResizetoContents)
self.tableWidget.verticalHeader().setVisible(False)
self.tableWidget.verticalHeader().setDefaultSectionSize(13)
self.vol_name = 'MAZZONI'
zz=1
self.tableWidget.setSpan(0,1,3)
newItem = QTableWidgetItem(self.vol_name)
newItem.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignHCenter)
self.tableWidget.setItem(0,newItem)
self.tableWidget.setSpan(1,3)
newItem = QTableWidgetItem(self.alphamese)
newItem.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignHCenter)
self.tableWidget.setItem(1,newItem)
while zz <= 10:
self.dow = 'do'+str(zz)
self.value = 'AAAAAAAA' +str(zz)
self.tableWidget.setItem(zz+1,QtWidgets.QTableWidgetItem(str(zz)))
self.tableWidget.setItem(zz+1,QtWidgets.QTableWidgetItem(self.dow))
item = QtWidgets.QTableWidgetItem(self.value)
item.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignHCenter)
self.tableWidget.setItem(zz+1,2,item)
zz += 1
pippo = 0
#return
if __name__ == '__main__':
app = QApplication(sys.argv)
anno = '2021'
mese = 'January'
ex = MakeStrip(anno,mese)
sys.exit(app.exec_())
如何获得第二张图片的第一列与左图的大小相同?
附言第二行将包含另一个跨区信息
解决方法
问题不是跨度而是最小宽度的计算 列中所有项目的所有信息,即使跨度是否应用,例如可以看到宽度是相同的,有没有跨度:
无跨度:
带跨度:
因此,解决此问题的一个技巧是在不使用模型的情况下通过委托传递文本:
import sys
from PyQt5 import QtCore,QtWidgets
class SpecialStyledItemDelegate(QtWidgets.QStyledItemDelegate):
def __init__(self,parent=None):
super().__init__(parent)
self._values = dict()
def add_text(self,text,row):
self._values[row] = text
def initStyleOption(self,option,index):
super().initStyleOption(option,index)
row = index.row()
if row in self._values:
option.text = self._values[row]
option.displayAlignment = QtCore.Qt.AlignCenter
class MakeStrip(QtWidgets.QWidget):
def __init__(self,anno,mese):
super().__init__()
self.initUI(anno,mese)
def initUI(self,mese):
self.title = "MAMbo - Strips di '%s' '%s' " % (mese,anno)
self.setWindowTitle(self.title)
self.setGeometry(50,100,250,800)
self.callTable(anno,mese)
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(self.tableWidget)
def callTable(self,mese):
anno = "2021"
self.alphamese = "January"
# Create table
self.tableWidget = QtWidgets.QTableWidget()
self.tableWidget.setRowCount(10)
self.tableWidget.setColumnCount(3)
self.special_delegate = SpecialStyledItemDelegate()
self.tableWidget.setItemDelegate(self.special_delegate)
self.special_delegate.add_text("MAZZONI",0)
self.special_delegate.add_text("January",1)
h_header = self.tableWidget.horizontalHeader()
h_header.hide()
for i in range(h_header.count()):
h_header.setSectionResizeMode(i,QtWidgets.QHeaderView.ResizeToContents)
v_header = self.tableWidget.verticalHeader()
v_header.hide()
v_header.setDefaultSectionSize(13)
self.tableWidget.setSpan(1,1,3)
self.tableWidget.setSpan(0,3)
for zz in range(1,10):
dow = "do{}".format(zz)
value = "AAAAAAAA{}".format(zz)
self.tableWidget.setItem(zz + 1,QtWidgets.QTableWidgetItem(str(zz)))
self.tableWidget.setItem(zz + 1,QtWidgets.QTableWidgetItem(dow))
item = QtWidgets.QTableWidgetItem(value)
item.setTextAlignment(QtCore.Qt.AlignCenter)
self.tableWidget.setItem(zz + 1,2,item)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
anno = "2021"
mese = "January"
ex = MakeStrip(anno,mese)
ex.show()
sys.exit(app.exec_())