Странная проблема с QGraphicsScene

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

Что я сделал до сих пор Я создал объект (в куче) с именем 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);
}

Выход

Странная проблема с QGraphicsScene

2) Вызов функции напрямую

Код есть

HomePage::HomePage(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::HomePage)
{
    ui->setupUi(this);
    realiser = new Block_Realiser(ui->graphicsView);
    realiser->drawRect();
}

Выход Странная проблема с QGraphicsScene

Так может ли кто-нибудь объяснить мне, что происходит в двух вышеупомянутых случаях? И как я могу достичь своей цели ?. Ранее я создал подклассы qwidget и повторно реализовал его paintEvent, чтобы достичь того же результата, что и моя цель. Но в qgraphicsscene этого не происходит. Пожалуйста, помогите мне. Если какие-либо детали отсутствуют, дайте мне знать.

А ваша проблема в том, что прямоугольник не в верхнем левом углу? Это связано с ограничивающим прямоугольником сцены. По умолчанию QGraphicsView центрирует сцену. Попробуйте ui->graphicsView->setAlignment(Qt::AlignLeft|Qt::AlignTop);

king_nak 07.06.2018 08:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
90
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Координаты AddRect относятся к элементу, а не к виджету, содержащему qgraphicscene.

Вам следует вызвать

  m_Scene->addRect(0,0,100,100);

Я все еще получаю тот же результат

Gurushant 07.06.2018 08:28
Ответ принят как подходящий

Положение просмотров пересчитывается, когда оно отображается. Когда вы используете таймер, значения m_View->x() и m_View->y(), вероятно, отличаются от значений, когда вы вызываете свой метод drawRect напрямую. Это означало бы разные значения ширины и высоты. Я не понимаю, почему вы используете позицию просмотра + 100 для расчета размера вашего прямоугольника.

Если вы хотите, чтобы ваш прямоугольник находился в верхнем левом углу, просто установите выравнивание для вашего представления:

m_View->setAlignment(Qt::AlignLeft | Qt::AlignTop);

позиция + 100 была частью моего старого кода, ее следовало удалить, чтобы избежать путаницы

Gurushant 07.06.2018 10:32

Другие вопросы по теме