2015-11-17 2 views
2

Я борется с 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. enter image description here

Что я могу сделать, чтобы представление, созданное в 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(); 

равен единице.

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

ответ

1

Я нашел ответ на свой вопрос в этом answer.

Разместил fitInView вызов внутри класса 'showEvent.

protected: 
    virtual void showEvent(QShowEvent *event) { 
     if(m_startUp) 
     { 
      ui->myGraphicsView->fitInView(s->items().at(0), Qt::KeepAspectRatio); 
      // or, either works fine: 
      // ui->myGraphicsView->fitInView(0,0,500,300, Qt::KeepAspectRatio); 
      m_startUp = false; 
     } 
     QMainWindow::showEvent(event); 
    } 

Я добавил m_startUp, потому что после увеличения и уменьшения, восстановления будет выполнять fitInView ...

Единственной альтернативой я нашел было найти несколько значений для использования в fitInView на основе геометрии пользовательского интерфейса, путем проб и ошибка ... Это не казалось хорошим вариантом.

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