【发布时间】:2017-07-04 15:39:51
【问题描述】:
我有一个带有QTableView 和从QAbstractItemModel 派生的模型的应用程序:表格的第一列包含一个文本(每行的标签),而第二列显示一个可以使用选择的值从自定义项目委托创建的 QComboBox。表格的内容可能会动态变化(行数、语言...)。
我想调整列的大小,以便第二个适合内容,而第一个会延伸占据剩余空间。
我的第一次尝试是:
tblData->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
tblData->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
结果:
问题是当QComboBox被选中时,它不适合该部分并且被剪裁了:
我已经通过手动增加宽度来解决这个问题:
tblData->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
tblData->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Fixed);
tblData->resizeColumnToContents(1);
tblData->horizontalHeader()->resizeSection(1, tblData->horizontalHeader()->sectionSize(1) + 40);
现在的问题是,通过使用这样的常量(在这种情况下为 40),部分的宽度将根据显示的值而不是所有可能的值而变化(如果已经显示了最大的值,或者只显示了最短的值) )。此外,该常量将取决于所使用的样式,因为它还与 QComboBox 占用的空间有关。
我曾考虑使用Qt::SizeHintRole 手动计算截面宽度,但它完全被忽略了。即使是这样,我也无法计算文本的实际宽度(使用QFontMetrics::width),因为模型中没有任何字体信息。
我尝试过的另一种方法是在QItemDelegate::createEditor 方法中设置QComboBox 的调整大小策略:
QWidget* myItemDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const {
auto comboBox = new QComboBox(parent);
comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
// ...
}
但现在组合框要么被剪裁,要么被缩短。
如何根据完整的内容范围而不是仅可见数据来设置节大小?
我正在用我目前找到的最佳方法以及我现在在项目中使用的最佳方法自行回答这个问题,但我不相信它(我详细说明了答案的原因) 所以我想知道正确的方法。谢谢!
【问题讨论】:
标签: c++ qt qlistview qitemdelegate sizehint