Подклассы qgraphicsview и установка неработающего поля

StackOverflow https://stackoverflow.com//questions/10709694

Вопрос

Я пытаюсь сделать функцию, похожую на INBOLY (из MATLAB) в Qt.Прямо сейчас у меня есть подкласс QGraphicsView и установил виртуальную функцию «Drawbackground» как:

void roiwindow::drawBackground(QPainter *painter, const QRectF &rect)
{
painter->save();
painter->drawImage(rect, *refimage);
painter->restore();
}
.

Это работает здорово и в основном, что именно то, что я хочу настолько далеко, как фоновый слой.Теперь я пытаюсь добавить круги, которые в конечном итоге действуют как узлы для многоугольника.Я сделал это с помощью:

QGraphicsView *view = new QGraphicsView(this);
view->show();
QGraphicsEllipseItem *e1;
e1 = this->addEllipse(20, 20, 30, 30, QColor(0, 0, 0), Qt::white);
e1->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsMovable);
.

Это своего рода того, что я хочу.Но есть проблема, что когда я нажимаю и перетащите эллипсы, фон эллипса - это масштабированная версия * movimage ... это оставляет вроде полосы на экране, но она исчезает, когда я нажимаю на другое окно илиминимизировать окно.QGRAPHICSITEM также звонит на нерегуляцию?Если так, то, кажется, называется только тогда, когда предмет перетаскивается.Любые предложения о том, как я могу кодировать это лучше?Спасибо.

Это было полезно?

Решение

Полосы возникают, потому что у вас, вероятно, есть QGraphicsView, установленные на по умолчанию Режим обновления ViewStort , который является QGraphicsView::MinimalViewportUpdate.В этом случае вам нужен генеракодицетагкод.Причина в том, что когда вы перемещаете предметы вокруг, фон позади них должен быть перерисован, но когда у вас есть множество REDRAWODICETAGCODE, только элементы будут передаваться (если нет полного обновления просмотра, например, из минимизации / максимизации окна),

Другие советы

QGraphicsView::drawBackground вызывается всякий раз, когда что-то из графического представления необходимо перерисовывать. Это что-то может быть меньше всего взгляда для лучшего характеристики.

Пример: когда у вас есть прямоугольный элемент, скажем, 50 х 50 пикселей, в пределах большей сцены / просмотра, и вы перемещаете этот прямоугольник на 20 пикселей вправо, только регион, покрытый предыдущим + новым положением элемента. (70 х 50 пикселей) Получает перерисованный (так как это область, которая меняется).

В вашем воспламенении генеракодицетагкода вы говорите:

painter->drawImage(rect, *refimage);
.

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

Для того, чтобы нарисовать изображение каждый раз в том же положении и в том же размере, вы можете использовать постоянную позицию (например, происхождение) и не изменяйте размер изображения:

painter->drawImage(0, 0, *refimage);
.

или вы можете использовать весь регион сцены:

painter->drawImage(sceneRect(), *refimage);
.

Там, где drawBackground определяется как такая же прямая ваша сцена использует для всей сцены. Этот rect обновляется автоматически при добавлении нового контента, который был бы вне прямоугольника. Вы также можете заставить сцену прямоугольника, установив его вручную в значение, например:

scene()->setSceneRect(0, 0, 800, 800);
.

См. Документация: sceneRect() и QGraphicsView::sceneRect

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top