【发布时间】:2016-09-23 18:38:01
【问题描述】:
我有一个QStyledItemDelegate 的子类,目前它没有重新实现任何功能(为简单起见)。
使用默认的QStyledItemDelegate 实现,当用户开始编辑QTableView 中的文本时,代理会使用模型中的文本绘制QLineEdit,并选择所有文本(突出显示所有文本以进行编辑)。
文本代表文件名,例如“document.pdf”。允许用户编辑整个文本,但是,我只想首先突出显示基本名称部分(“文档”)而不是后缀(“pdf”)。我怎样才能做到这一点? (我不需要这样做的逻辑,我需要知道如何让QStyledItemDelegate 突出显示部分文本)
我试过了:
在
setEditorData()中使用QLineEdit::setSelection()突出显示某些文本。这没有任何效果。在
paint()中尝试根据其他受访者对类似问题的建议进行绘画,但未成功。我对QPainter的经验很少。这是一个例子:Adjusting the selection behaviour of QStandardItem with QStyledItemDelegate
请提供帮助,并在此先感谢您。非常感谢您选择文本的前 3 个字符的代码 sn-p。
【问题讨论】:
-
当角色为
Qt::EditRole时,您可以让模型返回不带扩展名的文件名。但这样一来,用户将无法更改扩展名。 -
如果您希望扩展是可编辑的,您不需要绘制选择,您需要在行编辑上真正设置选择以排除扩展。您提到的第二种方法对您不起作用。
-
覆盖
setEditorData并设置您想要的选择应该可以正常工作。但是在Qt source code 中,您可以在setEditorData之后看到对le->selectAll();的调用。不幸的是,这意味着您在setEditorData中所做的任何选择都会在该呼叫中发生变化。这就是为什么您的第一种方法行不通的原因。 -
@Mike 关于如何选择文本的一部分有什么建议吗?
标签: c++ qt qstyleditemdelegate