Текст QLabel не выделяется, даже если я установил Qt :: TextSelectableByMouse внутри QStyledItemDelegate - PullRequest
1 голос
/ 17 января 2012

У меня есть простой делегат элемента типа QStyledItemDelegate, и внутри его метода рисования у меня есть этот код. Это хорошо, но главное, чтобы текст выбирался для копирования, а это не работает.

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();   
}

1 Ответ

3 голосов
/ 17 января 2012

Потому что все, что вы делаете, это рисуете QLabel. QLabel не «существует» в представлении модели, к которому вы обращаетесь, он отображается только в том состоянии, в котором вы его создали .

Вы должны использовать

QStyle::drawControl( ControlElement element,
                     const QStyleOption* option,
                     QPainter* painter,
                     const QWidget* widget = 0 ) const;

чтобы нарисовать этикетку. Не создавайте новый QLabel каждый раз, когда вам нужно нарисовать его, это не только неэффективно, вы также создали причину утечки памяти, не удаляя ее ...

Что еще более важно, выбор текста действительно должен быть частью делегата редактора, поэтому вы должны переопределить

QWidget* QAbstractItemDelegate::createEditor( QWidget* parent,
                                              const QStyleOptionViewItem& option,
                                              const QModelIndex& index ) const;

чтобы вернуть виджет, который может отображать редактируемый форматированный текст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...