Я борется с QGraphicsView
и fitInView()
.QGraphicsView fitInView на вид, созданный в режиме разработки, не работает
Я создал сцену (очень большую) и прямоугольник, который должен отображаться при загрузке. Но при загрузке изображение всегда приближается очень далеко.
Итак, я создал небольшую тестовую программу, и fitInView
работал просто отлично!
После большой борьбы, пытаясь понять, что не так, я обнаружил, что единственная разница между моим крошечным тестом и гигантской программой заключалась в том, что гигантская программа использовала созданный дизайнером ui.
Так вот моя попытка воспроизвести:
classes.h
#include <QGraphicsView>
#include <QGraphicsRectItem>
class MyView : public QGraphicsView
{
public:
MyView(QWidget *parent = 0) : QGraphicsView(parent) {
setBackgroundRole(QPalette::Highlight);
}
};
class MyScene : public QGraphicsScene
{
public:
MyScene(qreal sceneW, qreal sceneH, qreal canvasW, qreal canvasH, QObject* parent = 0)
: QGraphicsScene(parent) {
setSceneRect(0.5*(canvasW - sceneW), 0.5*(canvasH - sceneH), sceneW, sceneH);
m_background = new QGraphicsRectItem();
m_background->setBrush(Qt::white);
m_background->setPen(Qt::NoPen);
m_background->setRect(0, 0, canvasW, canvasH);
addItem(m_background);
}
private:
QGraphicsRectItem* m_background;
};
main.cpp
#define USING_UI
#include <QApplication>
#include "classes.h"
#ifdef USING_UI
#include <QMainWindow>
#include "ui_form.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow {
public:
explicit MainWindow(QWidget *parent=0):QMainWindow(parent),ui(new Ui::MainWindow) {
ui->setupUi(this);
MyScene* s = new MyScene(2000, 1000, 500, 300);
ui->myGraphicsView->setScene(s);
ui->myGraphicsView->fitInView(0,0,500,300); // with Qt::KeepAspectRatio
// or ui->myGraphicsView->fitInView(s->items().at(0), Qt::KeepAspectRatio);
}
private:
Ui::MainWindow *ui;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow w;
w.show();
return app.exec();
}
#else
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyScene s(2000, 1000, 500, 300);
MyView view;
view.setScene(&s);
view.show();
view.fitInView(0,0,500,300); // with Qt::KeepAspectRatio for pretty
// or view.fitInView(s.items().at(0), Qt::KeepAspectRatio);
return app.exec();
}
#endif
И form.ui
содержит QGraphicsView
, добавлено в MyView
, ничего больше.
Результаты очень разные - и я не могу понять, как исправить версию ui.
Что я могу сделать, чтобы представление, созданное в ui (с помощью Qt Designer), чтобы «вставить в поле зрения» прямоугольник или объект, который я предлагаю при запуске?
Я нахожу это очень странным, что
qDebug() << s->sceneRect();
qDebug() << ui->myGraphicsView->mapToScene(s->sceneRect().toRect()).boundingRect();
qDebug() << ui->myGraphicsView->mapFromScene(s->sceneRect()).boundingRect();
все отображения то же самое, и
QTransform t = ui->myGraphicsView->viewportTransform();
равен единице.
Возможно, я мог бы найти способ установить это преобразование вручную - на основе фактических координат окна просмотра, но я не знаю, как - или что произойдет, если позже форма изменит размер.