2013-08-22 4 views
3

У меня возникли проблемы с установкой моего содержимого (растяжения) сцены в мой QDeclarativeView. Я загружаю файл QML обычным способом. Я отменяю метод showEvent и resizeEvent на коде ниже:Qt 4.8.5 QGraphicsView :: fitInView не подходит точно

QGraphicsItem* rootItem = this->scene()->items.at(0); 
QRectF rootRect = rootItem->sceneBoundingRect(); // it gives me a QRectF(0,0,1920,1080) 
this->fitInView(rootRect, Qt::IgnoreAspectRatio); // Aspect doesn't matters. 

Проблема заключается в том, что он продолжает показывать небольшую белую рамку (почти 4 пикселей) вокруг содержимого. Я тестировал в 1920x1080, 1920x1200 и 1440x900, и все эти разрешения на моем рабочем столе показывают содержимое с той же проблемой. Даже в полноэкранном режиме он сохраняет небольшую белую границу.

Чтобы убедиться, что это ничего не значит из содержимого, я установил черную картинку в фоновом режиме, а белая рамка стала черной (другими словами, содержимое уменьшено слишком сильно, чтобы вписаться).

Вычитание значений из прямоугольного жесткого кодирования не является опцией, если оно изменяет часть фона в зависимости от размера содержимого. (Он должен адаптироваться динамически).

Любые предложения?

+0

Если вы пытаетесь вставить всю сцену в поле зрения с fitInView, что я думаю, что вы видите, это граница MainWindow (QDeclarativeView). Посмотрите на удаление этих элементов, чтобы предотвратить отображение белой границы. Возможно, что настройка frameRectangle на нулевое значение прямой или наследование и установка полей на ноль помогут. – TheDarkKnight

+0

@ Merlin069 Это не оконные рамы. Это фон сцены, о котором я рассказывал в описании вопроса. Паллиативное решение состоит в том, чтобы нарисовать фон сцены черным QBrush (я использую темное фоновое изображение в файле QML). – emanuelcds

+0

Как раз упомянуть, я уже пробовал свойство stylesheet без успеха. Это не граница. Реальная проблема заключается в том, что fitInView не является точной подгонкой контента. – emanuelcds

ответ

2

Только что столкнулся с проблемой. Поскольку ошибка не будет решена, я отправлю свое частное решение. Я подклассифицировал QGraphicsView и добавил метод myFitInView(), который автоматически выполняет масштабирование и центрирование.

Я предполагаю, что если вам нужно больше производительности, вы также можете непосредственно заполнить матрицу, но мне это не нужно, и поэтому масштабируйте и центрируйте отдельно.

Кроме того, любые предыдущие преобразования представлений теряются при таком подходе, но вы, вероятно, могли бы также объяснить это, получив текущую матрицу и соответствующим образом изменив/умножив ее.

void MyGraphicsView::myFitInView(QRectF const &rect) 
{ 
    QRectF viewRect = frameRect(); 

    double scaleX = viewRect.width()/rect.width(); 
    double scaleY = viewRect.height()/rect.height(); 

    QTransform trans; 
    trans.scale(scaleX, scaleY); 
    setTransform(trans, false); 

    centerOn(rect.width()/2, rect.height()/2); 
} 
+1

Его изящное решение. Хотя я бы хотел проверить его на коде, который у меня был 2 года назад, когда у меня была эта проблема. Проект был перенесен на Qt 5.2, и этого не происходит в этой версии. Я принимаю это как правильный ответ. – emanuelcds

+1

Я на Qt 5.4.1 и столкнулся с точной проблемой. – B3ret

+1

Это не происходит в 5.2.0 (мы больше не обновляем его). Ты должен попытаться. Вы уверены, что это не проблема контекста? Вы используете новый график сцены opengl? – emanuelcds

1

похоже на ошибку в Qt: https://bugreports.qt-project.org/browse/QTBUG-11945. мой уродливые обходной путь для этого является

QRectF removeMargin11945(const QRectF& sceneRect, const QSize& viewerSize){ 
    const int bugMargin = 2; 
    const double mx = sceneRect.width()/viewerSize.width()*bugMargin; 
    const double my = sceneRect.height()/viewerSize.height()*bugMargin; 
    return sceneRect.adjusted(mx, my, -mx, -my); 
} 

Что делает его особенно уродливо, что иногда это не требуется, и все просто отлично работает, будьте осторожны, чтобы различать эти случаи.

+0

Неприемлемо, когда решение должно работать с несколькими разрешениями и соотношением сторон. Маржа не является постоянной. Это зависит от разрешения. – emanuelcds

Смежные вопросы