Я сталкиваюсь с досадной проблемой при использовании инфраструктуры Qt QGraphicsView.
Я пишу основной просмотрщик изображений для отображения большого B&Широкие изображения.
Изображения отображаются с использованием QGraphicsPixmapItem
и добавил к сцене.
Мне также нужно нарисовать цветной прямоугольник вокруг области просмотра.
void ImageView::drawForeground( QPainter * painter, const QRectF & rect )
{
if( m_image ) {
qDebug() << "drawForeground(), rect = " << rect;
QBrush br(m_image->isValidated() ? Qt::green : Qt::red);
qreal w = 40. / m_scaleFactor;
QPen pen(br, w);
painter->save();
painter->setOpacity(0.5);
painter->setPen(pen);
painter->drawRect(rect);
painter->restore();
}
}
На первый взгляд работает отлично.
Но когда я прокручиваю содержимое области просмотра, все становится ужасно.
drawForeground()
метод эффективно вызывается, но кажется, что содержимое области просмотра ранее не стиралось. Таким образом, рисунок становится ужасным на экране.
Есть ли лучший способ добиться этого?
РЕДАКТИРОВАТЬ
Как упоминалось в стихах, внутренние компоненты Qt не позволяют мне достичь этого с помощью drawForeground ().
Я нашел обходной путь с помощью QGraphicsRectItem который изменяется в viewportEvent ().
Loos как:
bool ImageView::viewportEvent(QEvent *ev)
{
QRect rect = viewport()->rect();
if( m_image ) {
QPolygonF r = mapToScene(rect);
QBrush br2(m_image->isValidated() ? Qt::green : Qt::red);
qreal w2 = 40. / m_scaleFactor;
QPen pen2(br2, w2);
m_rect->setPen(pen2);
m_rect->setOpacity(0.5);
m_rect->setRect(r.boundingRect());
}
return QGraphicsView::viewportEvent(ev);
}
Код не завершен, но в основном будет выглядеть так.
Работает нормально, хотя немного мигает при слишком быстрой прокрутке …
Задача ещё не решена.
Других решений пока нет …