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

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

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

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

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

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

6 ответов


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

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

Я нашел решение (не стесняйтесь публиковать свои альтернативы :) ), все же я думал, что этот ответ может быть полезен, поскольку я боролся с 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);
}

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

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

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


view->setDragMode(QGraphicsView::NoDrag); сделал трюк для меня.

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


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

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

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

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

другое простое решение, если интерактивность не требуется, - отключить QGraphicsView:

view->setEnabled(false);

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