微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

QTableWidget 列跨度未正确调整大小

如何解决QTableWidget 列跨度未正确调整大小

我按照应该完成的方式填充了 QTableWidget() :) 现在我遇到了 col span 的问题。

enter image description here

左图显示了每列的正确大小,右图是我在引入第一行“跨越”后得到的结果,这不是我想要的。

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_())

如何获得第二张图片的第一列与左图的大小相同?

附言第二行将包含另一个跨区信息

解决方法

问题不是跨度而是最小宽度的计算 列中所有项目的所有信息,即使跨度是否应用,例如可以看到宽度是相同的,有没有跨度:

无跨度:

enter image description here

带跨度:

enter image description here

因此,解决此问题的一个技巧是在不使用模型的情况下通过委托传递文本:

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_())

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。