Метод QStyledItemDelegate sizeHint не вызывается для строки QTableView

У меня есть QTableView с использованием QSqlQueryModel (получает данные из SQLite).

Существует подкласс QStyledItemDelegate с именем MiniItemDelegate, который я использую в качестве делегата для Предметы. Я настроил метод sizeHint() следующим образом:

QSize MiniItemDelegate::sizeHint(const QStyleOptionViewItem &option,
                                 const QModelIndex &index) const
{
    // just for testing...breakpoint shows this line never gets called
    return QSize(256,256);  
}

Я не уверен, почему этот метод не вызывается, когда я запускаю следующий код:

m_pMiniItemDelegate = new MiniItemDelegate(this);
ui->PList_tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->PList_tableView->setSelectionMode(QAbstractItemView::SingleSelection);
ui->PList_tableView->setItemDelegate(m_pMiniItemDelegate);
ui->PList_tableView->setAlternatingRowColors(true);
ui->PList_tableView->setModel(ListMiniSqlModel::instance());

Это также не работает:

ui->PList_tableView->resizeColumnsToContents();
ui->PList_tableView->resizeRowsToContents();

И это не так:

QHeaderView* headerView = ui->PList_tableView->horizontalHeader();
headerView->setResizeMode(QHeaderView::ResizeToContents);

person user63898    schedule 20.03.2012    source источник
comment
QTreeView ведет себя так, как вы ожидаете, и это проблема только с QTableView? (Я так понимаю, вы уже нашли эту тему: qtforum.org/article/13421/ )   -  person HostileFork says dont trust SE    schedule 20.03.2012
comment
да, я видел это, может быть, мне нужно где-то установить Qt::SizeHintRole, но факт, что я создаю подкласс QStyledItemDelegate, и там нет метода data() для наследования   -  person user63898    schedule 20.03.2012


Ответы (3)


QStyledItemDelegate::sizeHint полезен, только когда вызываются QTableView::resizeRowsToContents, QTableView::resizeRowToContents, QTableView::resizeColumnsToContents и QTableView::resizeColumnToContents. или использовать

QHeaderView* headerView = tableView->horizontalHeader();
headerView->setResizeMode(QHeaderView::ResizeToContents);
person netawater    schedule 29.05.2013
comment
Есть ли где-нибудь хорошая документация или информация об этом? - person eric; 16.10.2015

Вы пробовали: setColumnWidth или setRowHeight и horizontalHeader()->setResizeMode(QHeaderView::Fixed)?

person leonardo    schedule 21.03.2012
comment
как я могу ? мне нужно установить размер каждой строки? это слишком много, может быть, я столкнулся с этой ошибкой? отчеты об ошибках. qt-project.org/browse/ - person user63898; 26.03.2012

(Доверие должно быть предоставлено.) В комментарии @HostileFork о обсуждение форума Qt, есть комментарий нить. В этой ветке пользователь mikhailt предлагает хорошее решение.

verticalHeader имеет свойство DefaultSectionSize, которое можно настроить. Неважно, отображается ли на самом деле вертикальный заголовок (метки в левой части таблицы) или нет, размер все равно будет использоваться.

ui->PList_tableView->verticalHeader()->setDefaultSectionSize(34);

Это только что решило мою проблему с Qt 5.6 и избавило меня от необходимости настраивать высоту каждой строки данных отдельно или изменять размер таблицы.

Судя по возрасту ветки комментариев, где я ее нашел, это уже работало и в Qt 4.

person Eliyahu Skoczylas    schedule 27.06.2016