Russian Qt Forum
Март 29, 2024, 00:14 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с отрисовкой виджета в делегате [Решено]  (Прочитано 2538 раз)
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);
}
« Последнее редактирование: Ноябрь 26, 2014, 09:37 от rizzoli » Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Ноябрь 20, 2014, 17:08 »

ну а что мешает в paint() сначала перерисовать весь фон например так

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

Набросал по памяти. Ваша проблема в том, что вы не очищаете фон перед отрисовкой новой картинки. А так как они разного размера, то остаются такие артефакты.
Записан
rizzoli
Гость
« Ответ #2 : Ноябрь 26, 2014, 09:36 »

Да, с размером картинок проблема была. Поставил размер больше в SizeHint - все нормально стало.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.044 секунд. Запросов: 22.