这里有一个更简单的解决方案,我刚好让它工作了。它不需要复杂的大小计算,你只需要:
- 在两个方向上将
QTableWidget::sizePolicy
设置为 Minimum
- 将
QTableWidget::sizeAdjustPolicy
设置为 AdjustToContents
- 调用
this->adjustSize()
来缩小主窗口到内容大小
表格将始终显示完整的内容,没有任何滚动条,即使以后添加了一些行。要获取表格大小,可以使用 tbl->sizeHint()
。
由于当添加行时它总是增加高度,因此您应该注意高度可能超过屏幕高度的情况。避免这种情况的简单方法是将表格包装在另一个滚动区域中,并设置滚动区域的高度,在需要时显示滚动条。
可以使用 Qt Creator C++ 项目复制的完整 C++ 代码:
#include "mainwindow.h"
#include <QAbstractScrollArea>
#include <QDebug>
#include <QPushButton>
#include <QSizePolicy>
#include <QTableWidget>
#include <QVBoxLayout>
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow) {
ui->setupUi(this);
QVBoxLayout *vbox = new QVBoxLayout(ui->centralwidget);
QPushButton *btn = new QPushButton("Add row", ui->centralwidget);
QTableWidget *tbl = new QTableWidget(2, 2, ui->centralwidget);
vbox->addWidget(btn);
vbox->addWidget(tbl);
connect(btn, &QPushButton::clicked, this, [=]() {
tbl->insertRow(tbl->rowCount());
qDebug().nospace() << "tbl size: " << tbl->sizeHint();
});
QSizePolicy policy(QSizePolicy::Minimum, QSizePolicy::Minimum);
tbl->setSizePolicy(policy);
tbl->setSizeAdjustPolicy(
QAbstractScrollArea::SizeAdjustPolicy::AdjustToContents);
qDebug().nospace() << "tbl size: " << tbl->sizeHint();
this->adjustSize();
this->setFixedSize(this->sizeHint());
this->setWindowFlag(Qt::WindowType::MSWindowsFixedSizeDialogHint, true);
}
MainWindow::~MainWindow() { delete ui; }
对于 Python(独立代码):
import sys
from PySide2 import QtCore, QtWidgets
class TestWidget(QtWidgets.QMainWindow):
def __init__(self, parent=None) -> None:
super().__init__(parent)
central_widget = QtWidgets.QWidget()
self.setCentralWidget(central_widget)
vbox = QtWidgets.QVBoxLayout(central_widget)
btn = QtWidgets.QPushButton("Add row", central_widget)
tbl = QtWidgets.QTableWidget(2, 2, central_widget)
vbox.addWidget(btn)
vbox.addWidget(tbl)
btn.clicked.connect(self.add_row)
policy = QtWidgets.QSizePolicy(
QtWidgets.QSizePolicy.Policy.Minimum,
QtWidgets.QSizePolicy.Policy.Minimum,
)
tbl.setSizePolicy(policy)
tbl.setSizeAdjustPolicy(
QtWidgets.QAbstractScrollArea.SizeAdjustPolicy.AdjustToContents
)
print(f"tbl size: {tbl.sizeHint()}")
self.adjustSize()
self.setFixedSize(self.sizeHint())
self.setWindowFlag(QtCore.Qt.MSWindowsFixedSizeDialogHint, True)
self.tbl = tbl
def add_row(self) -> None:
self.tbl.insertRow(self.tbl.rowCount())
print(f"tbl size: {self.tbl.sizeHint()}")
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
test_widget = TestWidget()
test_widget.show()
sys.exit(app.exec_())
如果您运行上述代码(无论是C++还是Python),您应该在控制台中看到以下消息,指示表格小部件的大小从开始到我添加另外4行的时刻:
tbl size: QSize(292, 127)
tbl size: QSize(292, 164)
tbl size: QSize(292, 201)
tbl size: QSize(292, 238)
tbl size: QSize(292, 275)
- C++的Qt版本:
5.15.2 (MSVC 2019 64位)
- Python的Qt版本:
PySide2==5.15.2
,PyQt==5.15.6
resize(1, 1);
的问题。 - D KQWidget::setMinimumSize()
来设置您所需的大小。 - Donotalo