代码之家  ›  专栏  ›  技术社区  ›  Narek

Qt setColumnWidth不起作用

  •  2
  • Narek  · 技术社区  · 15 年前

    编写了以下代码:

    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 回复  |  直到 15 年前
        1
  •  3
  •   Sergei Eliseev    15 年前

    Qt的逻辑是这样的,在列调整大小之后,滚动条区域检查列如何适合它。如果所有列的宽度之和小于小部件的可见宽度,则最后一列的大小将被调整以填充空间,从而导致调用结果不可见 setColumnWidth()

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

    int secondColumnWidth = 100;
    int firstColumnWidth = m_selectCategoryTableWidget->width() - secondColumnWidth;
    
    if (firstColumnWidth > 0)
    {
        m_selectCategoryTableWidget->setColumnWidth(0, firstColumnWidth);
    }
    else
    {
        m_selectCategoryTableWidget->resizeColumnsToContents();
    }
    

    祝你好运!

        2
  •  3
  •   jjcf89    14 年前

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

    int secondColumnWidth = 100;
    m_selectCategoryTableWidget->header()->setStretchLastSection(false);
    m_selectCategoryTableWidget->header()->setResizeMode(0, QHeaderView::Stretch);
    m_selectCategoryTableWidget->setColumnWidth(1, secondColumnWidth);
    
        3
  •  0
  •   Jordan    14 年前

    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);
        }
    }