Здравствуйте.
Суть вопроса такова: есть модель 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);
}