为QTreeView覆盖QStyledItemDelegate中的文本
Override Text in QStyledItemDelegate for QTreeView
使用QStyledItemDelegate
覆盖为QTreeView
显示的文本时遇到问题。当满足某些条件时,执行以下代码:
void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
.
.
QStyleOptionViewItemV4 opt = option;
initStyleOption(&opt, index);
QString text = opt.text;
text = text + QString("TEST");
opt.text = text;
QStyledItemDelegate::paint(painter, opt, index);
}
我在debbug中确认TEST已添加到opt.text
中
但是,当我运行程序并查看TreeVuew
时,它仍然显示原始文本,而没有附加TESTstring
。
当我调用QStyledItemDelegate::paint(painter, opt, index)
时,它似乎忽略了我对opt
参数所做的更改。
QStyledItemDelegate::paint()
方法的默认实现使用它自己的QStyleOptionViewItem
实例,该实例是用模型中的数据初始化的。
来自Qt 5.4.0的源代码:
void QStyledItemDelegate::paint(QPainter *painter,
const QStyleOptionViewItem &option, const QModelIndex &index) const
{
Q_ASSERT(index.isValid());
QStyleOptionViewItem opt = option;
initStyleOption(&opt, index);
const QWidget *widget = QStyledItemDelegatePrivate::widget(option);
QStyle *style = widget ? widget->style() : QApplication::style();
style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, widget);
}
解决方案:
不要像这样调用默认实现并实现您的代表的paint()
方法:
void MyDelegate::paint(QPainter* painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
{
QStyleOptionViewItem itemOption(option);
initStyleOption(&itemOption, index);
itemOption.text = "Test Text"; // override text
QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &itemOption, painter, nullptr);
}
如果要更改视图中显示的文本,另一种解决方案是覆盖displayText()
方法。
Qt5:示例
mydelegate.h
virtual QString displayText(const QVariant &value,
const QLocale &locale) const override;
mydelegate.cpp
QString MyDelegate::displayText(const QVariant &value,
const QLocale &locale) const
{
Q_UNUSED(locale)
QString result = value.toString() + "TEST";
return result;
}
文档链接:https://doc.qt.io/qt-5/qstyleditemdelegate.html#displayText
根据委托的类型,我也会尝试覆盖setEditorData()
方法,甚至createEditor()
(在其中可以添加与模型不同的值)。这比在油漆中进行这样的操作耗时更少。
否则,你可以用类似的东西把文本画到你想要的地方:
painter->drawText(option.rect, Qt::AlignJustify, text + "_test");
你这样做可能有原因,但如果你想在运行中添加额外的文本,你的设计似乎有问题?
可能的QStyledItemDelegate::paint
直接从index.data( Qt::DisplayRole ).toString()
中选取文本。这就是为什么文本没有更改。您可以通过Qt源进行调试以确定。
我建议你用QIdentityProxyModel
来做这样的事情。代表不是为这样的解决方案而设计的。您只需要覆盖1个方法。所以你的代码应该是这样的:
class MyProxyModel : public QIdentityProxyModel
{
// ...
};
QVariant MyProxyModel::data(const QModelIndex &index, int role) const override
{
if ( /*Conditions when you don't want to change source text*/ )
return QIdentityProxyModel::data( index, role );
// Extra check for editors or other roles to return original data
if ( role == Qt::EditRole || role != Qt::DisplayRole )
return QIdentityProxyModel::data( index, role );
const auto sourceIndex = mapToSource( index );
const auto originalText = sourceModel()->data( sourceIndex, Qt::DisplayRole ).toString();
const auto newText = QString( "%1 [TEST]" ).arg( originalText );
return newText;
}
// Usage
auto yourModel = YourOriginalModel( this );
auto proxy = MyProxyModel( this );
proxy->setSourceModel( yourModel );
view->setModel( proxy );
- 文本文件中的单词链表
- 从命令行c++发送文本文件名
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 2D数组来自文本输入,中间有空格
- 如何将内容数组写入文本文件?
- 无法通过空白将文本文件行分隔为矢量
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- C++将文本文件中的数据读取到结构数组中
- 在指针的帮助下,文本文件中单词的频率
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将值从二维数组输出到文本文件
- 如何在c++中从文本文件中逐行读取整数
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何从文本文件中读取值和数组
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何根据单词在文本中出现的概率输出单词
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- C++试图读取一个文件并输出到另一个文本文件
- 如何通过套接字将文本文件的内容从服务器发送到客户端