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);
Это также предотвратит его прокрутку, однако он также больше не будет получать события мыши или клавиатуры.