QGraphicsView: отключить автоматическую прокрутку - PullRequest
6 голосов
/ 14 января 2011

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

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

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

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

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

Ответы [ 6 ]

7 голосов
/ 25 февраля 2011

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

void QGraphicsViewDerived::scrollContentsBy(int, int)
{
    //don't do anything hah!
}
4 голосов
/ 14 января 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);
}
2 голосов
/ 14 августа 2018

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

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

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

class GraphicsView : public QGraphicsView
{
protected:
    void wheelEvent(QWheelEvent*) override {}
    void keyPressEvent(QKeyEvent* e) override { QWidget::keyPressEvent(e); }
};
2 голосов
/ 18 августа 2016

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

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

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

1 голос
/ 28 ноября 2014

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

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

0 голосов
/ 08 июня 2014

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

view->setEnabled(false);

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

...