Qt setColumnWidth не работает - PullRequest
       11

Qt setColumnWidth не работает

2 голосов
/ 03 июля 2010

Написали следующий код:

m_selectCategoryTableWidget = new QTableWidget;
m_selectCategoryTableWidget->setRowCount(0);
m_selectCategoryTableWidget->setColumnCount(2);

m_selectCategoryTableWidget->setHorizontalHeaderLabels(QStringList()<<tr("Category")<<tr("Number of items"));
m_selectCategoryTableWidget->verticalHeader()->setVisible(false);
m_selectCategoryTableWidget->horizontalHeader()->setStretchLastSection(true);
//m_selectCategoryTableWidget->setColumnWidth(0,400);
m_selectCategoryTableWidget->resizeColumnsToContents();
m_selectCategoryTableWidget->setColumnWidth(1,100); //this does not take effect

Пожалуйста, помогите.

Ответы [ 3 ]

3 голосов
/ 07 июля 2010

Что ж, логика Qt такова, что после изменения размера столбца область прокрутки проверяет, как столбцы вписываются в него.И если сумма ширины всех столбцов меньше видимой ширины виджета, то размер последнего столбца изменяется, чтобы заполнить пространство, приводящее к отсутствию видимого результата вызова setColumnWidth () .На самом деле происходит два изменения размера - сужение и обратное увеличение.

Итак, урок - получить видимую ширину элемента управления, пересчитать размеры по своему усмотрению и изменить размер всего, кроме последнего столбца.Для случая с двумя столбцами это действительно просто:

int secondColumnWidth = 100;
int firstColumnWidth = m_selectCategoryTableWidget->width() - secondColumnWidth;

if (firstColumnWidth > 0)
{
    m_selectCategoryTableWidget->setColumnWidth(0, firstColumnWidth);
}
else
{
    m_selectCategoryTableWidget->resizeColumnsToContents();
}

Удачи!

2 голосов
/ 15 июня 2011

Также можно указать, что вы хотите, чтобы первый столбец заполнял оставшееся пространство вместо последнего столбца. К сожалению, похоже, это не позволяет пользователю изменять размеры столбцов вручную.

int secondColumnWidth = 100;
m_selectCategoryTableWidget->header()->setStretchLastSection(false);
m_selectCategoryTableWidget->header()->setResizeMode(0, QHeaderView::Stretch);
m_selectCategoryTableWidget->setColumnWidth(1, secondColumnWidth);
0 голосов
/ 16 июня 2011

Это автоматически изменит размер столбцов («view» - это QTableView *, а модель - QSqlQueryModel *).

static_cast<QTableView*>(view)->horizontalHeader()
        ->resizeSections(QHeaderView::ResizeToContents);

QFontMetrics fm(view->font());

for (int i = 0 ; i < model->record().count(); ++i)
{
    int maxLength = 0;

    for (int j = 0; j < model->rowCount(); ++j)
    {
        QString cell = model->record(j).value(i).toString();

        if (fm.width(cell) > maxLength)
        {
            maxLength = fm.width(cell);
        }
    }
    QHeaderView& hv = *static_cast<QTableView*>(view)->horizontalHeader();

    if (maxLength > hv.sectionSize(i))
    {
        hv.resizeSection(i, maxLength * 1.5);
    }
}
...