QTableWidget: строка имеет неправильный размер

Я реализую небольшой пример, используя QTableWidget с определенными заголовками. Однако, как только я запускаю пример, строки не растягиваются должным образом, как это можно увидеть в следующем примере (что является неправильным поведением):

yo

После ручного изменения размера я получаю то, что ищу (это ожидаемое поведение):

yo2

prescriptiondialog.h

class PrescriptionDialog : public QDialog
{
    Q_OBJECT

public:
    PrescriptionDialog();
    ~PrescriptionDialog();

    QPushButton *mAddButton;
    QPushButton *mRemoveButton;
    QLineEdit *durationEdit;
    QLabel *durationLbl;
    DrugTable *mTable;
};
#endif // PRESCRIPTIONDIALOG_H

prescriptiondialog.cpp

#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QHeaderView>

PrescriptionDialog::PrescriptionDialog()
{
    setWindowTitle("Drug Mixer");
    mTable = new DrugTable();
    mTable->horizontalHeader()->setStretchLastSection(4);
    mTable->verticalHeader()->setStretchLastSection(QHeaderView::Interactive);
    mTable->show();
    QObject::connect(mAddButton, &QPushButton::clicked, mTable, &DrugTable::addCustomRow);
    QObject::connect(mRemoveButton, &QPushButton::clicked, mTable, &DrugTable::removeCustomRow);
    setLayout(mLay);
    show();
}

Что я уже сделал:

1) Я пытался использовать заголовки следующим образом, но это не дало ожидаемого результата. Проблема с этим подходом заключается в том, что столбцы расположены на одинаковом расстоянии друг от друга (я не ищу это конкретное поведение, потому что мне нужно, чтобы пользователь настраивал их по своему усмотрению) и, самое главное, строка занимает все пространство окна приложения, делая строку очень большой.

PrescriptionDialog::PrescriptionDialog()
{
    setWindowTitle("Drug Mixer");
    mTable = new DrugTable();
    mTable->horizontalHeader()->setStretchLastSection(4);
    mTable->verticalHeader()->setStretchLastSection(QHeaderView::Interactive);
    QHeaderView* header = mTable->horizontalHeader();
    header->setSectionResizeMode(QHeaderView::Stretch);
    QHeaderView* headerRows = mTable->verticalHeader();
    headerRows->setSectionResizeMode(QHeaderView::Stretch);
    mTable->show();
}

2) Я попробовал вариант использования horizontalHeader(), предоставляемого QTableWidget, но это не дало никаких улучшений, и на самом деле я получил эффект первого снимка экрана (столбец «Когда делать» сжат до тех пор, пока я настроить вручную)

PrescriptionDialog::PrescriptionDialog()
{
    setWindowTitle("Drug Mixer");
    mTable = new DrugTable();
    mTable->horizontalHeader()->setStretchLastSection(4);
    mTable->verticalHeader()->setStretchLastSection(QHeaderView::Interactive);
    mTable->resizeRowsToContents();
    mTable->horizontalHeader()->setSectionResizeMode(4, QHeaderView::Stretch);
    mTable->show();
}

3) я наткнулся на этот источник, это другой источник, но ни один из них не помог решить проблему.

4) Я углубился в проблему и просмотрел это, использующее свойство resizeRowsToContents(), которое я использовал в примере, но ничего не изменил в конечном результате.

Спасибо, что пролили свет на это и предоставили рекомендации по решению проблемы.


person Emanuele    schedule 07.10.2020    source источник
comment
Как вы устанавливаете виджет в 4-й столбец?   -  person Ngoc Minh Nguyen    schedule 08.10.2020


Ответы (1)


Я попытался сделать небольшой пример, используя resizeRowsToContents(), и у меня он хорошо работает.
Проверено на Qt 5.15.1 MinGW.

#include "mainwindow.h"

#include <QTableView>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QStandardItemModel>
#include <QHeaderView>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QStandardItemModel *model = new QStandardItemModel{this};
    model->appendRow({new QStandardItem{tr("Drug")}, new QStandardItem{}});

    QTableView *view = new QTableView{this};
    view->setModel(model);

    QHBoxLayout *horz_layout = new QHBoxLayout;
    horz_layout->addWidget(new QPushButton{tr("Add when"), this});
    horz_layout->addWidget(new QPushButton{tr("Remove when"), this});

    QStandardItemModel *inner_model = new QStandardItemModel{this};
    inner_model->setHorizontalHeaderLabels({tr("Select"), tr("When to take")});

    QTableView *inner_view = new QTableView{this};
    inner_view->setModel(inner_model);

    QWidget *widget = new QWidget;
    QVBoxLayout *vert_layout = new QVBoxLayout{widget};
    vert_layout->addLayout(horz_layout);
    vert_layout->addWidget(inner_view);

    view->horizontalHeader()->setStretchLastSection(true);
    view->setIndexWidget(model->index(0, 1), widget);
    view->resizeRowToContents(0);

    this->setCentralWidget(view);
    this->resize(500, 500);
}

MainWindow::~MainWindow()
{
}

Результат:

Результат

person Ngoc Minh Nguyen    schedule 08.10.2020
comment
Спасибо за вашу помощь! :) ваш пример работает, и я не думал об использовании QStandardItemModel, что является отличной идеей! Спасибо, что заглянули и уделили время! Если вы считаете, что мой вопрос был понятен, пожалуйста, поставьте мне палец вверх! :) Хорошего дня! - person Emanuele; 08.10.2020