#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. Спасибо за ваш ответ, извините, что мне потребовалось некоторое время, чтобы ответить. Я внес изменения, которые вы предлагаете, но все равно получаю то же смещение. Похоже, у меня есть фундаментальное непонимание того, как это должно работать. Я думал, что добавление изображения в окно будет самой простой частью этого проекта!