QTableView:双击列标题时调整所有列的大小

时间:2016-01-25 14:28:52

标签: qt4

在单个列标题的边缘上进行双重调整时,会调整该列的大小以适合内容。 如果选择多列,当双击任何所选列标题的边缘时,如何调整所有选定列的大小?

1 个答案:

答案 0 :(得分:1)

  1. 将部分广告连接至QHeaderView::sectionHandleDoubleClicked信号
  2. 在该广告位中获取所选列。
  3. 使用QHeaderView::setResizeModeQHeaderView::ResizeToContents
  4. 自动调整它们
  5. 获取新的绝对色谱柱尺寸。
  6. 将列调整大小模式还原为QHeaderView::Interactive或其他任何内容。
  7. 使用QHeaderView::resizeSection设置新的绝对列大小。
  8. 一个例子:

    Widget::Widget(QWidget *parent)
        : QWidget(parent)
    {
        QStandardItemModel *model = new QStandardItemModel(this);
        for (int i = 0; i < 10; ++i)
        {
            QList<QStandardItem*> items;
            for (int j = 0; j < 4; ++j)
            {
                QStandardItem *item = new QStandardItem;
                QChar ch = QString::number(j).at(0);
                item->setText(QString().fill(ch, 20));
    
                items << item;
            }
    
            model->appendRow(items);
        }
    
        view = new QTableView;
        view->setModel(model);
    
        connect(view->horizontalHeader(), SIGNAL(sectionHandleDoubleClicked(int)),
                this, SLOT(sectionHandleDoubleClicked(int)));
    
        QVBoxLayout *layout = new QVBoxLayout(this);
        layout->addWidget(view);
    }
    
    void Widget::sectionHandleDoubleClicked(int logicalIndex)
    {
        QHeaderView *header = view->horizontalHeader();
    
        QModelIndexList list = view->selectionModel()->selectedIndexes();
    
        QSet<int> columns;
        Q_FOREACH (QModelIndex index, list)
        {
            if (index.isValid())
            {
                columns.insert(index.column());
            }
        }
    
        Q_FOREACH (int column, columns)
        {
            header->setResizeMode(column, QHeaderView::ResizeToContents);
            int newWidth = header->sectionSize(column);
            header->setResizeMode(column, QHeaderView::Interactive);
            header->resizeSection(column, newWidth);
        }
    }