Странная проблема с QGraphicsScene - PullRequest
0 голосов
/ 07 июня 2018

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

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

Выход:

enter image description here

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

Код

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

Выход enter image description here

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

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

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

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

m_View->setAlignment(Qt::AlignLeft | Qt::AlignTop);
0 голосов
/ 07 июня 2018

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

Вы должны позвонить

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