如何防止 QTableview 中过于激进的文本删除?

use*_*153 5 c++ qt qtablewidget qtablewidgetitem qt5

我有一个问题,Qt 中的文本删除在表格中过于激进,请参见图片。 在此输入图像描述

带有完整数字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"));
Run Code Online (Sandbox Code Playgroud)

和结果

在此输入图像描述

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

sco*_*nov 5

当一切都刚刚好时...

...解决方案可能很简单,只需禁用 中的删除QTableWidget并直接将删除的字符串设置为项目的文本,如下所示:

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

不幸的是,QTableWidget(或者也许是QStyledItemDelegate)不尊重QAbstractItemView::textElideMode财产。

因此,您需要以困难的方式来完成它,即使用委托。不过不用担心,它并不复杂。

解决方案

  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);
     }
    
    Run Code Online (Sandbox Code Playgroud)

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

  1. 为所需的列设置 的tableWidget委托,如下所示:

     tableWidget->setItemDelegateForColumn(0, new Delegate(this));
    
    Run Code Online (Sandbox Code Playgroud)

Delegate你的子类在哪里QStyledItemDelegate

结果

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

带有正确省略文本的表格

  • 3年过去了,这个问题显然还没有解决吗? (2认同)