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
Вызов fitInView () дважды работает, но вы должны позволить Qt обрабатывать его события между двумя вызовами.
Это также означает, что вы в конечном итоге перерисовываете графическое представление дважды.
Чтобы избежать этого, я делаю так:
В вашем коде это будет выглядеть так:
bool updateState = updatesEnabled();
setUpdatesEnabled(false);
fitInView(clicked, Qt::KeepAspectRatio);
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
fitInView(clicked, Qt::KeepAspectRatio);
setUpdatesEnabled(updateState);
Причиной может быть следующее (по крайней мере, похоже, что в отчете об ошибке): 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 года.