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)
和结果
请注意,我想避免自己进行删除,因为用户可以编辑该值。自己进行删除意味着在编辑开始时(也许通过委托)放回真正的值。会很复杂。
...解决方案可能很简单,只需禁用 中的删除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
财产。
因此,您需要以困难的方式来完成它,即使用委托。不过不用担心,它并不复杂。
子类化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)
请随意将填充更改为合适的值。
为所需的列设置 的tableWidget
委托,如下所示:
tableWidget->setItemDelegateForColumn(0, new Delegate(this));
Run Code Online (Sandbox Code Playgroud)
Delegate
你的子类在哪里QStyledItemDelegate
。
此修改的结果是一列包含正确省略的文本。
归档时间: |
|
查看次数: |
2940 次 |
最近记录: |