@Mercury13
Программист на «си с крестами» и не только

Qt: авторесайз колонки по образцу?

Старый добрый QTableView.
Предположим, что в таблице очень много строк и потому обычный авторесайз не подходит (тормозит). Хотел бы сделать авторесайз, так сказать, по образцу. Точнее, большее из двух: ширина заголовка и ширина некоего образца.

Например, для числовых колонок я бы взял образец 0000,0000. Для дат 00 Www 0000. Для строк — 20 средних букв (20/26 ширины английского алфавита). И так далее.

P.S. Очень много = десятки тысяч.
  • Вопрос задан
  • 220 просмотров
Решения вопроса 1
@Mercury13 Автор вопроса
Программист на «си с крестами» и не только
Нашёл способ.

namespace {

    // Пока делегат стандартный, использую шаблон «Паблик Морозов».
    // Если нет — он сам и будет Морозовым.
    class QStyledItemDelegateMorozov : public QStyledItemDelegate {
    public:
        using QStyledItemDelegate::initStyleOption;
    };

}


void SomeReport::autoResize()
{
    QHeaderView* header = table->horizontalHeader();
    QStyledItemDelegateMorozov* delegate =
            reinterpret_cast<QStyledItemDelegateMorozov*>(
            dynamic_cast<QStyledItemDelegate*>(table->itemDelegate()));
    QStyle* style = table->style();
    QStyleOptionViewItem option;
    for (int col = 0; col < model.columnCount(); ++col) {
        QModelIndex index = model.index(0, col);
        delegate->initStyleOption(&option, index);
        option.text = "12345678901234";
        int headerSize = header->sectionSizeHint(col);
        int cellSize = style->sizeFromContents(
                QStyle::CT_ItemViewItem, &option, QSize(), table).width();
        table->setColumnWidth(col, std::max(headerSize, cellSize));
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы