没有为 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】:

您尝试过:setColumnWidthsetRowHeighthorizo​​ntalHeader()->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 方法的主要内容,如果未能解决你的问题,请参考以下文章

“行高改变”的 QTableView 信号或事件

QTableView 中的着色行而不是单元格

QTableView 没有行区的信号

将颜色设置为 QTableView 行

从 QTableView 中的选定行访问 QAbstractTableModel 中的原始索引

更改 QTableView 中的默认行大小