我有一个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/

10-15 07:00