Resize QTableView / QSqlQueryModel



  • Hi, i have 2 problems (sorry my english is bad, let me know if you don't understand).

    1. Is their a way to use resizeColumnsToContents() and resizeSections(QHeaderView::ResizeMode::Stretch) at the same time ? Because if i used only resizeColumnsToContents it's like this (didn't feet the white space) : example
      And if i used resizeSections(QHeaderView::ResizeMode::Stretch) it's like this (some columns are unnecessarily large and some need to be large to display their content) : example

    2. At initialization the table is not affected by the resize methodes, i tried to setVisible(0 and 1) between resize but it doesn't work. Did you have an idea ?

    Thanks for helping me.



    1. http://doc.qt.io/qt-5/qheaderview.html#stretchLastSection-prop
    2. could you try forcing a call to update() on the QTableView?


    1. Result :
      example
      It's still looking bad. Is their a way to set an equal stretch between each columns ? Like that : example

    2. Apparantly not.



  • @Gaalee said in Resize QTableView / QSqlQueryModel:

    It's still looking bad. Is their a way to set an equal stretch between each columns ? Like that :

    setSectionResizeMode(QHeaderView::Stretch)



  • Doesn't work with resizeColumnsToContents().



  • Ok, now I understood, you want to equally distribute the extra space among the remaining columns.

    protected:
    void resizeEvent(QResizeEvent *ev)
    {
        QWidget::resizeEvent(ev);
        resizeHeaders();
    }
    Q_SLOT void resizeHeaders()
    {
        QHeaderView* const tableHead = view->horizontalHeader();
        const int secCount = tableHead->count();
        if (view->model()->rowCount() == 0 || secCount<=1) {
            tableHead->resizeSections(QHeaderView::Stretch);
            return;
        }
        tableHead->resizeSections(QHeaderView::ResizeToContents);
        QVector<int> allHints(secCount);
        for (int i = 0; i < secCount; ++i)
            allHints[i]= tableHead->sectionSize(i);
        const int extraSpace = tableHead->width() - std::accumulate(allHints.constBegin(), allHints.constEnd(), 0);
        for (int i = 0; i < secCount; ++i)
            tableHead->resizeSection(i, allHints.at(i) + static_cast<int>(static_cast<double>(extraSpace) / static_cast<double>(secCount)));
    }
    

    then in the constructor add

    view->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
    view->horizontalHeader()->setStretchLastSection(true);
    connect(model, &QAbstractItemModel::rowsRemoved, this, &QuoteViewer::resizeHeaders);
        connect(model, &QAbstractItemModel::dataChanged, this, &QuoteViewer::resizeHeaders);
        resizeHeaders();
    

    This will distribute the extra space evenly, not based on the original size, it's trivial to modify the math to achieve this other result btw


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.