Нашёл способ.
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));
}
}