QTableWidget 列跨度未正确调整大小

Posted

技术标签:

【中文标题】QTableWidget 列跨度未正确调整大小【英文标题】:QTableWidget column span doesnt resize correctly 【发布时间】:2020-12-29 14:07:18 【问题描述】:

我按照应有的方式填充了 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, anno, mese):
        self.title = "MAMbo - Strips di '%s' '%s' "%(mese, anno)
        self.setWindowTitle(self.title)
        self.setGeometry(50, 100, 250, 800)
        MakeStrip.callTable(self, anno, mese)
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.tableWidget)
        self.setLayout(self.layout)
        # Show widget
        self.show()

    def callTable(self, anno, 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, 0, 1, 3)
        newItem = QTableWidgetItem(self.vol_name)
        newItem.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignHCenter)
        self.tableWidget.setItem(0, 0, newItem)

        self.tableWidget.setSpan(1, 0, 1, 3)
        newItem = QTableWidgetItem(self.alphamese)
        newItem.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignHCenter)
        self.tableWidget.setItem(1, 0, newItem)

        while zz <= 10:
            self.dow = 'do'+str(zz)
            self.value = 'AAAAAAAA' +str(zz)
            self.tableWidget.setItem(zz+1, 0, QtWidgets.QTableWidgetItem(str(zz)))
            self.tableWidget.setItem(zz+1, 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_())

如何获取第二张图片的第一列,其大小与左侧图片中的一样?

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

【问题讨论】:

请提供minimal reproducible example 我能做的就是发布整个代码 这不是 MRE,因为有很多东西没有定义 这个应该是MRE。 :) 这似乎是一个错误:bugreports.qt.io/browse/QTBUG-89116 可能有解决方法,但它可能需要重新实现 sizeHintForColumn() 或使用项目委托。 (PS:请不要使用“pippo”:-P) 【参考方案1】:

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

无跨度:

有跨度:

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

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, anno, 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, anno, 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, 0, 1, 3)
        self.tableWidget.setSpan(0, 0, 1, 3)

        for zz in range(1, 10):
            dow = "do".format(zz)
            value = "AAAAAAAA".format(zz)
            self.tableWidget.setItem(zz + 1, 0, QtWidgets.QTableWidgetItem(str(zz)))
            self.tableWidget.setItem(zz + 1, 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_())

【讨论】:

您的解决方案没问题。我犯了一个错误,没有告诉你正确的视图是我左图中的那个,没有 vol_name 和 alphamese 的那个。然后我添加了两个变量,问题就出现了。将尝试使您的建议适应我的脚本,并让您知道。附:我在路上还有其他麻烦。 :) 谢谢 @steza 不要让我知道任何事情,我不是在帮助实施您的项目,我只是在解决您在帖子中显示的问题,仅此而已。所以我不负责它在其他应用程序中的实现。请阅读How to Ask 并查看tour 了解更多信息 @eyllanesc 很抱歉你这么想。这只是一个很大的误会。无论如何感谢您的解决方案

以上是关于QTableWidget 列跨度未正确调整大小的主要内容,如果未能解决你的问题,请参考以下文章

Qt QTableWidget 列调整大小

调整列大小时 C++ Qt QTableWidget 项目移动

自动调整 QLabel 的大小以适应更新的 QTableWidget 跨度

调整 QTableWidget 中的列大小

qt中QTableWidget怎么根据内容自动调整列宽行高?

如何防止用户使用 Python 和 Qt 在 QtableWidget 中移动列的大小?