Нечетное смещение в окне QT при использовании QGraphicsView и QGraphicsScene

#c #qt

Вопрос:

Я пытаюсь создать три разных окна, отображающих разные ортогональные представления в наборе 3D-данных. У меня есть панель инструментов в качестве главного окна, и это просто переключает видимость других окон.

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

 #include "sliceview.h"
#include "ui_sliceview.h"

SliceView::SliceView(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::SliceView)
{
   ui->setupUi(this);
   viewArea = new QGraphicsView;
   scene = new QGraphicsScene(0, 0, this->x(), this->y(), this);
   viewArea->setScene(scene);
   setCentralWidget(viewArea);

}

void SliceView::ShowSlice(size_t slice)
{
   
   //slice not used in minimal example
   
   scene->clear();
   if (m_plane == XYPLANE)
   {
       setWindowTitle("XY");
       image = QPixmap(":/images/XY.png");
   }
   else if (m_plane == YZPLANE)
   {
       setWindowTitle("YZ");
       image = QPixmap(":/images/YZ.png");
   }
   else
   {
       setWindowTitle("XZ");
       image = QPixmap(":/images/XZ.png");
   }
   scene->addPixmap(image);
   scene->addLine(0,0,100,100,QPen(Qt::yellow));

   scene->update();
   auto width = image.width();
   auto height = image.height();
   viewArea->resize(width,height);
   viewArea->resize(scene->width(),scene->height());
   viewArea->update();
}
 

Это создает окно, подобное этому, в котором изображение смещено от левого верхнего угла окна. Я хочу, чтобы размер окна соответствовал изображению, которое оно содержит, и чтобы координата 0,0 изображения окна была в верхнем левом углу.
Где я ошибаюсь?

Полный (минимальный) проект можно найти здесь

Изображение, показывающее проблему, изображение градиента находится не там, где я хочу, в окне

Комментарии:

1. попробуйте добавить viewArea->setAligment(Qt::AlignTop | Qt::AlignLeft);

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

Ответ №1:

мне кажется, что вы неправильно задаете параметры конструктору

 scene = new QGraphicsScene(0, 0, this->x(), this->y(), this);
 

this->x() и this->y() всегда будет возвращаться 0 , я предлагаю использовать setSceneRect

  scene = new QGraphicsScene(this);
 scene->setSceneRect(-1.5, -1.5, 1.5, 1.5); 
 ui->viewArea->setScene(scene);
 ui->viewArea->show();
 
 

остальное можно сделать так

  ...
 QRectF bound = scene->itemsBoundingRect();
 bound.setWidth(image.width());         
 bound.setHeight(image.height());
 ui->viewArea->fitInView(bound, Qt::KeepAspectRatio);
 ui->viewArea->centerOn(0, 0);
 ...

   
 

Комментарии:

1. Спасибо за ваш ответ, извините, что мне потребовалось некоторое время, чтобы ответить. Я внес изменения, которые вы предлагаете, но все равно получаю то же смещение. Похоже, у меня есть фундаментальное непонимание того, как это должно работать. Я думал, что добавление изображения в окно будет самой простой частью этого проекта!