QGraphicsView: отключить автоматическую прокрутку

Я хочу иметь QGraphicsView, который никогда не прокручивается автоматически.

Аналогично: мой вопрос идентичен http://developer.qt.nokia.com/forums/viewthread/2220 , но эта ветка не получила ответа.

Что я пробовал до сих пор:

  • В рамках showEvent() и resizeEvent() я делаю ui->graphicsView->fitInView(...), который отлично работает, пока элементы не выходят за пределы прямоугольника экрана
  • Я также пытался манипулировать преобразованием вида, но, кроме масштабирования, его коэффициенты никогда не меняются, так что это тоже было бесплодно.
  • Отключение внешнего вида полосы прокрутки тоже не помогает

См. также http://doc.qt.io/qt-4.8/qgraphicsview.html.


person Sebastian Mach    schedule 14.01.2011    source источник


Ответы (6)


Мое решение немного схематично, но я думаю, что оно довольно интуитивно понятно: если вы не хотите, чтобы QGraphicsView когда-либо прокручивал ваш материал, переопределите виртуальный метод scrollContentsBy.

void QGraphicsViewDerived::scrollContentsBy(int, int)
{
    //don't do anything hah!
}
person anonvt    schedule 25.02.2011

Я нашел решение (не стесняйтесь публиковать свои альтернативы :)), тем не менее я подумал, что этот ответ может быть полезен, поскольку я боролся с Google и документацией около 15 часов.

Ключевым моментом является вызов не только fitInView(), но и setSceneRect(). Это сделало это для меня (замените FooBar своим собственным именем класса):

void FooBar::resizeEvent(QResizeEvent *) {
        fitView();
}

void FooBar::showEvent(QShowEvent *) {
        fitView();
}

void FooBar::fitView() {
        const QRectF rect = QRectF(-0.5,-0.5, 1, 1);
        ui->graphicsView->fitInView(rect,
                                    Qt::KeepAspectRatio);
        ui->graphicsView->setSceneRect(rect);
}
person Sebastian Mach    schedule 14.01.2011

Я нашел идеальное решение, позвонив

QGraphicsView::setSceneRect(yourScene->sceneRect()) 

в конструкторе вашего представления автоматическое поведение прокрутки остановлено.

person Bigbell mercy    schedule 18.08.2016

Конечно, решение с setSceneRect() правильное, но при наличии большого количества унаследованного кода оно может оказаться слишком дорогим.

Я пробовал также scrollContentsBy(), но в моем случае это повлияло на позиционирование сцены.

Итак, я пришел к следующему решению:

class GraphicsView : public QGraphicsView
{
protected:
    void wheelEvent(QWheelEvent*) override {}
    void keyPressEvent(QKeyEvent* e) override { QWidget::keyPressEvent(e); }
};
person Andrei    schedule 14.08.2018

view->setDragMode(QGraphicsView::NoDrag); помог мне.

Решение от anonvt тоже работало, только мешало обновлению сцены.

person Alex    schedule 28.11.2014

Еще одно простое решение, если интерактивность не нужна, — отключить QGraphicsView:

view->setEnabled(false);

Это также предотвратит прокрутку, однако больше не будет получать события мыши или клавиатуры.

person laurent    schedule 08.06.2014