Russian Qt Forum

Qt => Model-View (MV) => Тема начата: rizzoli от Ноябрь 20, 2014, 11:20



Название: Проблема с отрисовкой виджета в делегате [Решено]
Отправлено: rizzoli от Ноябрь 20, 2014, 11:20
Здравствуйте.

Суть вопроса такова: есть модель QStandartItemModel, вью qlistView, написал делегат в виде виджета, указатель храниться в делегате. При выделении элемента - меняется цвет - все работает правильно. Далее, хочу сделать так, чтобы при выделении айтема, в виджете менялись элементы - сделал на виджете QStackedWidget и в делегате, в painte-е меняю страницы, страницы меняются, но во вью остаются края от предыдущего цвета, как на картинке. Если переключить фокус на другое окно - становиться нормально. Делал по примеру, добавил пример проекта.

Код делегата:

Код:
Delegate::Delegate(QObject *parent) :
    QItemDelegate(parent)
{
    wgt = new MyWidget();
}

void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{

    wgt->setImage(index.data(Qt::DecorationRole).value<QPixmap>());
    wgt->setText(index.data().toString());

    QPalette pal;
    QLinearGradient gradient(0, 0, 0, option.rect.size().height());

    if ((option.state & QStyle::State_Selected) == QStyle::State_Selected)
    {
        gradient.setColorAt(1.0, QColor(0,250,255));
        gradient.setColorAt(0.0, QColor(255,255,255));
        pal.setBrush(QPalette::Window, QBrush(QColor(Qt::transparent)));
        pal.setBrush(QPalette::Window, QBrush(gradient));
        wgt->switchWgt(true);
    }
    else
    {
        gradient.setColorAt(0.0, QColor(255,250,0));
        gradient.setColorAt(1.0, QColor(255,255,255));
        pal.setBrush(QPalette::Window, QBrush(QColor(Qt::transparent)));
        pal.setBrush(QPalette::Window, QBrush(gradient));
        wgt->switchWgt(false);
    }

    wgt->setPalette(pal);
    wgt->resize(option.rect.size());

    painter->save();
    painter->setRenderHint(QPainter::Antialiasing, true);
    painter->translate(option.rect.topLeft());
    wgt->render(painter);

    painter->restore();
}

QSize Delegate::sizeHint(const QStyleOptionViewItem &, const QModelIndex &) const
{
    return QSize(400, 250);
}


Название: Re: Проблема с отрисовкой виджета в делегате
Отправлено: Fregloin от Ноябрь 20, 2014, 17:08
ну а что мешает в paint() сначала перерисовать весь фон например так

Код:
painter->setBrush(QPalette::windowColor);
painter->drawRect(option.rect);

Набросал по памяти. Ваша проблема в том, что вы не очищаете фон перед отрисовкой новой картинки. А так как они разного размера, то остаются такие артефакты.


Название: Re: Проблема с отрисовкой виджета в делегате
Отправлено: rizzoli от Ноябрь 26, 2014, 09:36
Да, с размером картинок проблема была. Поставил размер больше в SizeHint - все нормально стало.