没有为 QTableView 行调用 QStyledItemDelegate 的 sizeHint 方法
Posted
技术标签:
【中文标题】没有为 QTableView 行调用 QStyledItemDelegate 的 sizeHint 方法【英文标题】:QStyledItemDelegate's sizeHint method not called for a QTableView row 【发布时间】:2012-03-20 07:00:59 【问题描述】:我有 QTableView 使用 QSqlQueryModel(它从 SQLite 获取数据)。
有一个名为MiniItemDelegate
的QStyledItemDelegate 子类,我将其用作项目的委托。我设置了这样的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);
【问题讨论】:
QTreeView 的行为是否如您所愿,而这只是 QTableView 的问题? (我认为你已经找到了这个帖子:qtforum.org/article/13421/…) 是的,我看到了,也许我需要在某处设置 Qt::SizeHintRole 但事实上我是 QStyledItemDelegate 的子类,并且没有 data() 方法可以继承 【参考方案1】:QStyledItemDelegate::sizeHint 仅在调用 QTableView::resizeRowsToContents、QTableView::resizeRowToContents、QTableView::resizeColumnsToContents 和 QTableView::resizeColumnToContents 时有用。或使用
QHeaderView* headerView = tableView->horizontalHeader();
headerView->setResizeMode(QHeaderView::ResizeToContents);
【讨论】:
是否有任何关于此的好的文档或信息?【参考方案2】:您尝试过:setColumnWidth 或 setRowHeight 和 horizontalHeader()->setResizeMode(QHeaderView::Fixed) 吗?
【讨论】:
我该怎么办?我需要设置每行大小吗?它对我来说太多了我面临这个错误? bugreports.qt-project.org/browse/…【参考方案3】:(信用到期。) 在@HostileFork 对Qt Forum discussion 的评论中,有一个评论线程。在该线程中,用户 mikhailt 提供了good solution。
verticalHeader 有一个可以调整的DefaultSectionSize 属性。垂直标题(表格左侧的标签)是否实际显示并不重要,仍然会使用大小。
ui->PList_tableView->verticalHeader()->setDefaultSectionSize(34);
这刚刚解决了我使用 Qt 5.6 的问题,并且使我免于单独调整每个数据行的高度或导致表格大小调整。
根据我发现它的评论线程的年龄,这也已经在 Qt 4 中工作了。
【讨论】:
以上是关于没有为 QTableView 行调用 QStyledItemDelegate 的 sizeHint 方法的主要内容,如果未能解决你的问题,请参考以下文章