c++ - QTableView 比它的容器大
问题描述
我正在研究 Qt 应用程序。我有QMainWindow。在里面我添加了 QTableView。当我运行该应用程序时,我发现我需要滚动以显示整个表格,并且它下方还会显示空白区域。我希望主窗口水平调整大小以使用表格所需的空间。另外我希望它垂直调整大小以不使用未使用的空间。我怎么能做到这一点?到目前为止,这是我的代码:
void MainWindow::initUi() {
setWindowTitle(tr("Main Window"));
QWidget* centralWidget = new QWidget(this);
QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget);
QFormLayout *upperLayout = new QFormLayout;
// Default layout appearance of QMacStyle
upperLayout->setRowWrapPolicy(QFormLayout::DontWrapRows);
upperLayout->setFieldGrowthPolicy(QFormLayout::FieldsStayAtSizeHint);
upperLayout->setFormAlignment(Qt::AlignHCenter | Qt::AlignTop);
upperLayout->setLabelAlignment(Qt::AlignLeft);
QVBoxLayout *resultsLayout = new QVBoxLayout;
QTableView* table = new QTableView(centralWidget);
table->verticalHeader()->hide();
QStandardItemModel* model= new QStandardItemModel(4, 4);
for (int row = 0; row < 4; ++row) {
for (int column = 0; column < 4; ++column) {
QStandardItem *item = new QStandardItem(QString("row %0, column %1").arg(row).arg(column));
model->setItem(row, column, item);
}
}
table->setModel(model);
QLabel* upperLabel = new QLabel(tr("Label:"), centralWidget);
upperLabel->setAlignment(Qt::AlignLeft);
resultLabel = new QLabel(tr("Result goes here"), centralWidget);
mainLayout->addLayout(resultsLayout);
resultsLayout->addLayout(upperLayout);
resultsLayout->addWidget(table);
upperLayout->addRow(upperLabel, resultLabel);
centralWidget->setLayout(mainLayout);
setCentralWidget(centralWidget);
this->adjustSize();
}
解决方案
将表格的 sizeAdjustPolicy 设置为 AdjustToContents 视图,然后在水平和垂直方向上将大小策略设置为 Fixed。
AdjustToContents 可能会对视图中的动态内容产生轻微的性能损失,因为每次数据更改都可能改变布局。
Qt Designer 是一个非常好的工具,可以快速解决布局问题;{table,list,tree}小部件的行为与视图完全相同(因为它们是相同的),并且小部件可以在 Qt Designer 中快速填充虚拟数据。
推荐阅读
- reporting-services - 在不包括假期的情况下,您如何计算 SSRS 中的工作日之间的日期?
- outlook - Outlook 加载项转发选定的电子邮件
- bash - 基于本地文件匹配删除远程文件的 Bash 脚本
- android - 使用 Malinskiy 的 marathon gradle 插件配置或指定 Marathonfile?
- r - 并排条形图中的颜色问题
- python - 有没有办法让降维参数取决于 sklearn 管道中的上一步?
- python - 如何通过一次来计算给定列表的 N 对?
- android-studio - Android Studio64 没有启动
- c# - 如何在asp.net mvc中通过多个不同的名称调用控制器的方法?
- c# - 通过多个代理将变量从一个 Visual Studio 测试任务传递到 Azure 管道中的另一个