python-3.x tableWidget.horizontalHeader().setStretchLastSection(True)在调整窗口大小时强制水平滚动条消失

at0kjp5o  于 2023-06-07  发布在  Python
关注(0)|答案(2)|浏览(227)

我用这些参数创建了一个QTableWidget。

def fill_table(self):
    self.tableWidget = QTableWidget(self.view_frame)
    self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
    self.tableWidget.setAlternatingRowColors(True)
    self.tableWidget.setFocusPolicy(Qt.NoFocus)
    self.tableWidget.setShowGrid(False)
    self.tableWidget.setSortingEnabled(True)

    self.tableWidget.horizontalHeader().setHighlightSections(False)
    self.tableWidget.horizontalHeader().setProperty("showSortIndicator", True)
    self.tableWidget.horizontalHeader().setStretchLastSection(True)

    self.tableWidget.verticalHeader().setVisible(False)
    self.tableWidget.verticalHeader().setHighlightSections(False)
    self.ui.tableWidget.setRowCount(0)
    self.ui.tableWidget.setColumnCount(6)
    self.ui.tableWidget.setRowCount(len(self.zipped_log))
    self.ui.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)
    self.ui.tableWidget.setSelectionMode(QAbstractItemView.SingleSelection)
    self.ui.tableWidget.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel)
    self.ui.tableWidget.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel)
    self.ui.tableWidget.setFocusPolicy(Qt.NoFocus)

    for i in range(len(self.zipped_log)):
        self.ui.tableWidget.setItem(i, 0, QTableWidgetItem(str(self.zipped_log[i]['date'])))
        self.ui.tableWidget.setItem(i, 1, QTableWidgetItem(str(self.zipped_log[i]['time'])))
        self.ui.tableWidget.setItem(i, 2, QTableWidgetItem(self.zipped_log[i]['source']))
        self.ui.tableWidget.setItem(i, 3, QTableWidgetItem(self.zipped_log[i]['code']))
        self.ui.tableWidget.setItem(i, 4, QTableWidgetItem(str(self.zipped_log[i]['severity'])))
        self.ui.tableWidget.setItem(i, 5, QTableWidgetItem(self.zipped_log[i]['description']))

    self.ui.tableWidget.resizeColumnsToContents()
    self.ui.tableWidget.resizeRowsToContents()
    self.ui.tableWidget.horizontalHeader().setStretchLastSection(True)

def resizeEvent(self, event):
    self.ui.tableWidget.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
    self.ui.tableWidget.setWordWrap(False)
    QMainWindow.resizeEvent(self, event)

除了用不同的内容填充表格和调整窗口大小之外,其他都运行良好。
在第一步中,我用适合窗口大小的短行填充表格。如果我再次调用filling函数,使用长行,这不适合窗口的大小,这些行将激活水平滚动条,所有工作正常,我可以水平滚动它们。但是在调整窗口大小后,长行开始换行,我再也不能用水平滚动条滚动它们了。
它看起来像三个点...,不是在行的实际末端,而是在窗口的边缘。
我已经尝试过使用resizeEvent,但它没有帮助。
如何解决此问题?我想要一个动态的水平滚动条,这将显示需要和行将不会换行后调整窗口

e0bqpujr

e0bqpujr1#

setStretchLastSection()将最后一节的调整大小模式更改为QHeaderView.Stretch。在Stretch模式下,无论列的内容是否比节宽,节总是填充可用空间,因此不会出现水平滚动条。(节的大小不会增加以适应列的内容。)
因此,如果您使用QTableView.resizeColumnsToContents(),我建议您不要使用setStretchLastSection()
如果您不介意以一种笨拙的方式手动调整列的大小,您可以这样做。(这是hacky,因为它可能会在未来的Qt版本中被打破。

from PyQt5.QtCore import QTimer
...

def resize_tableview_columns(tableview):
    tableview.resizeColumnsToContents()
    def on_idle():
        if not tableview.horizontalScrollBar().isVisible():
            header = tableview.horizontalHeader()
            last_col = header.count() - 1
            header.resizeSection(last_col, tableview.viewport().width() -
                sum(header.sectionSize(i) for i in range(last_col)))
    QTimer.singleShot(0, on_idle)

...

def fill_table(self):
    self.tableWidget = QTableWidget(self.view_frame)
    ...
    #self.tableWidget.horizontalHeader().setStretchLastSection(True) # Don't do this.
    ...
    #self.ui.tableWidget.resizeColumnsToContents() # Use the below instead of this.
    resize_tableview_columns(self.ui.tableWidget)
    ...
    #self.ui.tableWidget.horizontalHeader().setStretchLastSection(True) # Don't do this.
dw1jzc5e

dw1jzc5e2#

主要的问题是,表记住最长的行长度,并使用它,即使不同的文件与较短的行。所以,我只是更新最后一节每次我重新填充表的内容。我已经解决了这样的问题:
在MainClass中:

def resizeEvent(self, event):
   self.ui.tableWidget.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
   self.ui.tableWidget.setWordWrap(False)
   QMainWindow.resizeEvent(self, event)

def fill_table(self):
   self.tableWidget.horizontalHeader().setStretchLastSection(False)
   ...
   filling the table
   ...
   self.tableWidget.resizeColumnsToContents()
   self.tableWidget.resizeRowsToContents()
   self.tableWidget.horizontalHeader().setStretchLastSection(True)

相关问题