问题描述
具有完整数字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"));
和结果
请注意,由于用户可以编辑值,因此我想避免自己做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
属性。
因此,您需要用困难的方式做到这一点,即使用委托。不过请不要担心,它并不复杂。
解决方案
-
子类
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); }
随时将填充更改为合适的值。
-
为所需的列设置
tableWidget
的委托,如下所示:tableWidget->setItemDelegateForColumn(0,new Delegate(this));
其中Delegate
是您的QStyledItemDelegate
子类。
结果
此修改的结果是一列带有适当省略文本的列。