Моя цель:
Я хочу нарисовать простой прямоугольник длиной и шириной 100 в позиции x = 0, y = 0 в QGraphicsView. Это должно выглядеть примерно так

Что я сделал до сих пор Я создал объект (в куче) с именем block_realiser в конструкторе домашней страницы (MainWindow), он принимает QGraphicsView в качестве параметра в конструкторе. Я создал QGraphicsScene (в куче) в конструкторе реализатора блоков, и в самом его конструкторе я установил эту сцену в представление. В block_realiser есть функция drawRect, которая должна рисовать прямоугольник 100x100 в точке (0,0). Код есть
Block_Realiser::Block_Realiser(QGraphicsView *view, QObject *parent) :
QObject(parent)
{
m_View = view;
m_Scene = new QGraphicsScene;
m_View->setScene(m_Scene);
}
void Block_Realiser::drawRect()
{
m_Scene->addRect(m_View->x(), m_View->y(),
100, 100);
}
Теперь перейдем к моей проблеме. Есть два способа вызвать функцию drawRect в конструкторе домашней страницы. Один - через таймер (после задержки 100 мс), а другой - для прямого вызова 1) Через таймер код
HomePage::HomePage(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::HomePage)
{
ui->setupUi(this);
realiser = new Block_Realiser(ui->graphicsView);
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), realiser, SLOT(drawRect()));
connect(timer, SIGNAL(timeout()), timer, SLOT(deleteLater()));
timer->setSingleShot(true);
timer->start(100);
}
Выход
2) Вызов функции напрямую
Код есть
HomePage::HomePage(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::HomePage)
{
ui->setupUi(this);
realiser = new Block_Realiser(ui->graphicsView);
realiser->drawRect();
}
Так может ли кто-нибудь объяснить мне, что происходит в двух вышеупомянутых случаях? И как я могу достичь своей цели ?. Ранее я создал подклассы qwidget и повторно реализовал его paintEvent, чтобы достичь того же результата, что и моя цель. Но в qgraphicsscene этого не происходит. Пожалуйста, помогите мне. Если какие-либо детали отсутствуют, дайте мне знать.





Координаты AddRect относятся к элементу, а не к виджету, содержащему qgraphicscene.
Вам следует вызвать
m_Scene->addRect(0,0,100,100);
Я все еще получаю тот же результат
Положение просмотров пересчитывается, когда оно отображается. Когда вы используете таймер, значения m_View->x() и m_View->y(), вероятно, отличаются от значений, когда вы вызываете свой метод drawRect напрямую. Это означало бы разные значения ширины и высоты. Я не понимаю, почему вы используете позицию просмотра + 100 для расчета размера вашего прямоугольника.
Если вы хотите, чтобы ваш прямоугольник находился в верхнем левом углу, просто установите выравнивание для вашего представления:
m_View->setAlignment(Qt::AlignLeft | Qt::AlignTop);
позиция + 100 была частью моего старого кода, ее следовало удалить, чтобы избежать путаницы
А ваша проблема в том, что прямоугольник не в верхнем левом углу? Это связано с ограничивающим прямоугольником сцены. По умолчанию
QGraphicsViewцентрирует сцену. Попробуйтеui->graphicsView->setAlignment(Qt::AlignLeft|Qt::AlignTop);