QTableView 拉伸 Headers 但保持交互

QTableView Stretch Headers but keep Interactive

我正在努力尝试容纳我的 QTableView 以方便用户使用。

这个功能是我真正需要的:

ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

问题在于 headers 不再是用户可调的,完全冻结了。

我知道我们也有这个功能可以让用户调整Headers,但是在使用它之后,headers又回来了,就好像我之前没有使用过QHeaderView::Stretch一样:

ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);

我真的在很多网站上寻找过这个,但没有找到适合我水平的可以理解的答案。

谢谢!

我找到了方法,首先我需要设置每列的宽度以适应 QTableView 的大小,然后我拉伸最后一部分,所以现在每列都可以调整大小。

  for(int c = 0;c<=4;c++){
    ui->tableView->horizontalHeader()->resizeSection(c, 150);

    }

    ui->tableView->horizontalHeader()->setStretchLastSection(true);

谢谢

像这样使用 EventFilter 并将其安装在 tablewidget 最后一列默认大小必须知道 (self.last_baseColumnSize)) :

def eventFilter(self,obj,event):
    if  obj is self.ui.tableWidget and event.type()==QEvent.Type.Resize:
        hub=self.ui.tableWidget.horizontalHeader()
        fixedSizes=self.ui.tableWidget.verticalHeader().width()
        fixedSizes+=self.ui.tableWidget.columnCount()+1 #Borders
        if (self.ui.tableWidget.verticalScrollBar().isVisible()):
            fixedSizes += self.ui.tableWidget.verticalScrollBar().width()
        tmp=[x for x in range(self.ui.tableWidget.columnCount()) if hub.resizeMode(x) != QHeaderView.Fixed]
        
        for i in range (self.ui.tableWidget.columnCount()-1):
            if hub.resizeMode(i) == QHeaderView.Fixed:
                fixedSizes+=self.ui.tableWidget.columnWidth(i)
        if hub.resizeMode(self.ui.tableWidget.columnCount()-1) == QHeaderView.Fixed:
            fixedSizes+=self.last_baseColumnSize
        
        newsize=max(20,(event.size().width()-fixedSizes)/len(tmp))
        for i in tmp:
            self.ui.tableWidget.setColumnWidth(i,newsize)
    return False