繁体   English   中英

Qt setColumnWidth不起作用

[英]Qt setColumnWidth does not work

编写了以下代码:

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

请帮忙。

好吧,Qt的逻辑是这样的,即在调整列大小之后,滚动条区域会检查列如何适应它。 并且,如果所有列的宽度之和小于小部件的可见宽度,那么将调整最后一列的大小以填充空间,从而导致调用setColumnWidth()时看不到结果。 实际上发生两种调整大小-缩小和反向放大。

因此,课程是-获取控件的可见宽度,根据需要重新计算尺寸,并调整除最后一列以外的所有尺寸。 对于两列的情况,这非常简单:

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

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

祝好运!

也可以指定您希望第一列填充剩余空间而不是最后一列。 不幸的是,这似乎确实阻止了用户能够手动调整列的大小。

int secondColumnWidth = 100;
m_selectCategoryTableWidget->header()->setStretchLastSection(false);
m_selectCategoryTableWidget->header()->setResizeMode(0, QHeaderView::Stretch);
m_selectCategoryTableWidget->setColumnWidth(1, secondColumnWidth);

这将自动调整列的大小以适合(“ 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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM