如何防止QTableview中的文字过于激进?

问题描述

我在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,new QTableWidgetItem("0.234823489789234"));

和结果

enter image description here

请注意,由于用户可以编辑值,因此我想避免自己做elide。自己动手做就意味着在编辑开始时可能会通过委托放回实际价值。会很复杂。

解决方法

一切正常时...

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

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

不幸的是,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,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的委托,如下所示:

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

其中Delegate是您的QStyledItemDelegate子类。

结果

此修改的结果是一列带有适当省略文本的列。

Table with a properly elided text