Увеличение / уменьшение масштаба точки? - PullRequest
3 голосов
/ 16 сентября 2010

Как видно на картинках.alt text

alt text

У меня есть QWidget внутри QScrollArea.QWidget действует как виджет рендеринга для изображения ячейки и некоторых векторных контуров данных.Пользователь может выполнять увеличение / уменьшение масштаба, и в результате происходит изменение масштаба QPainters и соответственно изменение размера размера QWidget.

Теперь я хочу выполнить увеличение / уменьшение масштаба для точки под мышью.(например, масштабирование в GIMP).Как рассчитать новые позиции полос прокрутки в соответствии с уровнем масштабирования?Лучше ли реализовать это с помощью преобразований без использования scrollarea?

Ответы [ 3 ]

3 голосов
/ 28 августа 2015

Одним из решений может быть получение нового класса из QScrollArea и переопределение, например, wheelEvent, чтобы масштабирование выполнялось с помощью колеса мыши и в текущей позиции курсора мыши.

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

void wheelEvent(QWheelEvent* e) {
    double OldScale = ... // Get old scale factor
    double NewScale = ... // Set new scale, use QWheelEvent...

    QPointF ScrollbarPos = QPointF(horizontalScrollBar()->value(), verticalScrollBar()->value());
    QPointF DeltaToPos = e->posF() / OldScale - widget()->pos() / OldScale;
    QPointF Delta = DeltaToPos * NewScale - DeltaToPos * OldScale;

    widget()->resize(/* Resize according to new scale factor */);

    horizontalScrollBar()->setValue(ScrollbarPos.x() + Delta.x());
    verticalScrollBar()->setValue(ScrollbarPos.y() + Delta.y());
}
0 голосов
/ 23 мая 2012

Вам нужно взять wheelEvent() на QWidget, получить event.pos () и передать его в QscrollArea.ensureVisible(), сразу после масштабирования QWidget.

def wheelEvent(self, event):
    self.setFixedSize(newWidth, newHeight)
    self.parent().ensureVisible(event.pos())

Это должно более или менее производить то, что вы хотите.

0 голосов
/ 16 сентября 2010

Будет ли аннулироваться QScrollArea::ensureVisible(int x, int y, int xmargin = 50, int ymargin = 50) делать то, что вам нужно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...