我有一个QStyledItemDelegate
类型的简单项目委托(delegate),在其paint方法内部我有此代码。它可以很好地渲染,但是这里的主要要点是我希望可以选择文本进行复制,但这是行不通的。
void ItemDelegate::paintBody( QPainter* painter,
const QStyleOptionViewItem& option,
const QModelIndex& index ) const
{
painter->save();
QLabel *l = new QLabel();
l->setTextFormat(Qt::RichText);
l->setTextInteractionFlags(Qt::TextSelectableByMouse);
l->setGeometry(option.rect);
l->setText("This is test");
l->setStyleSheet("QLabel { background-color : transparent; }");
l->render(painter, option.rect.topLeft());
painter->restore();
}
最佳答案
因为您要做的就是绘制QLabel。 QLabel不会“存在”于您要调用的模型 View 中,只会以您创建它的状态呈现。
你应该用
QStyle::drawControl( ControlElement element,
const QStyleOption* option,
QPainter* painter,
const QWidget* widget = 0 ) const;
绘制标签。不要每次都需要绘制新的
QLabel
时,不仅效率低下,而且还通过不删除它来创建了所有内存泄漏的根源。不过,更重要的是,选择文本确实应该是编辑器委托(delegate)的一部分,因此您应该覆盖
QWidget* QAbstractItemDelegate::createEditor( QWidget* parent,
const QStyleOptionViewItem& option,
const QModelIndex& index ) const;
返回可以显示可编辑的富文本格式的小部件。
关于c++ - 即使我在QStyledItemDelegate内设置Qt::TextSelectableByMouse,QLabel文本也不可选,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8893532/