c++ - 如何防止 QTableview 中过于激进的文本省略?

标签 c++ qt qt5 qtablewidget qtablewidgetitem

我有一个问题,Qt 中的文本省略在表格中过于激进,请参见图片。 enter image description here

完整数字为 0.8888 的单元格....自显示 QTableWidget 以来我已经编辑过,其他的与创建 QTableWidget 时一样。似乎 elide 是在实际情况下的较小宽度上计算的。当小部件变得可见时,如何防止这种情况并立即删除适当的文本?

简化重现代码:

QTableWidget *tableWidget;
tableWidget = new QTableWidget(Dialog);
tableWidget->setGeometry(QRect(40, 20, 256, 192));
tableWidget->setRowCount(4);
tableWidget->setColumnCount(1);
tableWidget->setItem(0, 0, new QTableWidgetItem("0.234823489789234"));

和结果

enter image description here

请注意,我想避免自己进行省略,因为用户可以编辑该值。自己做 elide 意味着在编辑开始时放回真实值,也许是通过委托(delegate)。会很复杂。

最佳答案

当一切正常时...

...解决方案可以像禁用 QTableWidget 中的省略号一样简单,并直接将省略的字符串设置为项目的文本,如下所示:

tableWidget->setTextElideMode(Qt::ElideNone);
tableWidget->setItem(0, 0, new QTableWidgetItem(tableWidget->fontMetrics().elidedText("0.234823489789234", Qt::ElideRight, tableWidget->columnWidth(0))));

不幸的是,QTableWidget(或者可能是QStyledItemDelegate)不遵守QAbstractItemView::textElideMode 属性。

因此,您需要用困难的方式来做到这一点,即使用委托(delegate)。不过别担心,它并没有复杂多少。

解决方案

  1. 子类 QStyledItemDelegate并像这样重新实现它的 paint 方法:

     void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const
     {
         if (!index.isValid())
             return;
    
         QStyleOptionViewItem opt = option;
         initStyleOption(&opt, index);
         int padding = 3;
    
         painter->save();
         painter->setClipRect(opt.rect);
         opt.rect = opt.rect.adjusted(padding, padding, -padding, -padding);
         painter->drawText(opt.rect, Qt::AlignLeft | Qt::AlignVCenter,
                           opt.fontMetrics.elidedText(opt.text, Qt::ElideRight,
                                                      opt.rect.width()));
         painter->restore();
    
         opt.rect = option.rect;
         opt.textElideMode = Qt::ElideNone;
         opt.text = "";
    
         QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter);
     }
    

请随意将填充更改为合适的值。

  1. 像这样为所需的列设置 tableWidget 的委托(delegate):

     tableWidget->setItemDelegateForColumn(0, new Delegate(this));
    

Delegate 是您的 QStyledItemDelegate 子类。

结果

此修改的结果是一个包含正确省略文本的列。

Table with a properly elided text

关于c++ - 如何防止 QTableview 中过于激进的文本省略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64198197/

相关文章:

python - 如何从 Qt::namespase (Qt5, Python3.x) 导入?

c# - C++ 中的结构大小 & 转换为 C#

c++ - 由于删除而崩溃(尝试处理异常...)

c++ - QRegExpValidator 参数

c++ - 如何正确调整 QGraphicsView 的大小?

qml - 如何使用索引访问 ListView 中的委托(delegate)属性

c++ - 用于验证类型的动态转换

c++ - 单元/集成测试时间敏感的 C++ 代码

c++ - 如何使用微 Controller 计算总时间

qt - 如何使用 v3 Rest api 从 Google Drive 下载文件?