Qt QGraphicsScene не соответствуетInView () с полосами прокрутки

QGraphicsView :: fitInView () кажется, игнорирует наличие полос прокрутки, которые, по-видимому, накладываются. (Также используется жестко заданное поле в 2 пикселя.)

Есть связанный отчет об ошибке (https://bugreports.qt-project.org/browse/QTBUG-1047), указав, что двойной вызов fitInView () решит проблему.

В моем случае это не так. Только двойной запуск вручную подходит для полос прокрутки. Это не работает:

void myGraphicsView::mousePressEvent(QMouseEvent *event) {
if( event->button() == Qt::LeftButton ) {
QGraphicsItem* clicked = scene()->itemAt( mapToScene( event->pos() ) );
qDebug() << clicked << clicked->boundingRect();
fitInView( clicked, Qt::KeepAspectRatio);
fitInView( clicked, Qt::KeepAspectRatio); // doesn't work for me
QGraphicsView::mousePressEvent(event);
return;
}
}

Есть ли другой обходной путь?

Qt 4.8.1 с MSVC2010

0

Решение

Вызов fitInView () дважды работает, но вы должны позволить Qt обрабатывать его события между двумя вызовами.

Это также означает, что вы в конечном итоге перерисовываете графическое представление дважды.

Чтобы избежать этого, я делаю так:

  1. Отключить обновления
  2. Позвонить fitInView
  3. Вызовите QApplication :: processEvents ()
  4. Вызовите fitInView еще раз
  5. Включить обновления

В вашем коде это будет выглядеть так:

bool updateState = updatesEnabled();
setUpdatesEnabled(false);
fitInView(clicked, Qt::KeepAspectRatio);
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
fitInView(clicked, Qt::KeepAspectRatio);
setUpdatesEnabled(updateState);
3

Другие решения

Причиной может быть следующее (по крайней мере, похоже, что в отчете об ошибке): https://bugreports.qt.io/browse/QTBUG-42331 — пожалуйста, проголосуйте за него на трекере ошибок qt, чтобы повысить его приоритет.

Короче говоря, fitInView имеет жестко запрограммированные поля, и это может привести к разного рода разрушениям, самое малое из которых заключается в том, что теперь вы теряете несколько пикселей области отображения, а также можете вызвать ненужное изменение масштаба. Это может вызвать быстрое изменение размера и странные нестабильности, такие, как описал отправитель ошибок QTBUG-1047.

Вы можете решить эту проблему, переопределив fitInView, основываясь на существующей реализации, но удалив нелепые поля. Пример этого доступен здесь в Python, основанном на оригинальной версии C ++:

https://github.com/nevion/pyqimageview/blob/master/qimageview/widget.py#L276

Дайте мне знать, если это решит вашу проблему! Таким образом, мы можем закрыть и эту ошибку с 2007 года.

1

По вопросам рекламы [email protected]