Ошибка при использовании функций QGraphicsScene в Qt

Я получаю ошибки, когда запускаю проект qt, и я не могу понять, в чем причина

ошибки:

'класс MainWindow' не имеет члена с именем 'setSceneRect' 'класс MainWindow' не имеет члена с именем 'setScene' 'mapToScene' не был объявлен в этой области

код:

главное окно.cpp:

 MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
QGridLayout * gridLayout = new QGridLayout(ui->centralWidget);
gridLayout->addWidget( new MainWindow() );

scene = new QGraphicsScene();
    this->setSceneRect(50, 50, 350, 350);
    this->setScene(scene);
 }

 void MainWindow::mousePressEvent(QMouseEvent * e)
{
    double rad = 1;
    QPointF pt = mapToScene(e->pos());
    scene->addEllipse(pt.x()-rad, pt.y()-rad, rad*2.0, rad*2.0,
        QPen(), QBrush(Qt::SolidPattern));
}

главное окно.ч:

private:
Ui::MainWindow *ui;
QGraphicsScene * scene;

person sh ze    schedule 29.11.2014    source источник
comment
Я не предлагаю вам запускать этот код, он займет всю вашу память. Вы выделяете память для mainwindow внутри конструктора mainwidow. Ваш конструктор вызывает другой конструктор, который вызывает другой и еще один. Вам нужно полностью переписать код.   -  person Kosovan    schedule 29.11.2014


Ответы (1)


Прежде всего, не делайте экземпляр MainWindow в его конструкторе. Я думаю, что вместо gridLayout->addWidget( new MainWindow() ); вы должны добавить свой вид в главное окно:

gridLayout->addWidget(view);

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

scene->setSceneRect(50, 50, 350, 350);

Также вы должны назначить сцену QGraphicsView, вызвав QGraphicsView::setScene :

QGraphicsView * view = new QGraphicsView(this) ;
view->setScene(scene);

mapToScene является функцией QGraphicsView. Итак, у вас должно быть что-то вроде:

QPointF pt = view->mapToScene(e->pos());

Наконец, я должен упомянуть, что у вас может быть собственный класс, который наследуется от QGraphicsView и реализует mousePressEvent и другие вещи, связанные со сценой и рисованием. Затем у вас может быть экземпляр вашего пользовательского класса в вашем файле MainWindow.

person Nejat    schedule 29.11.2014
comment
Спасибо, ваш ответ устранил первые две ошибки, но у меня все еще есть эта ошибка: `mapToScene' не был объявлен в этой области. - person sh ze; 29.11.2014
comment
Вы также использовали mapToScene в своем коде? Я ничего не вижу. - person Nejat; 29.11.2014
comment
извините, я отредактировал сообщение. Это в функции mousePressEvent - person sh ze; 29.11.2014
comment
mapToScene является функцией QGraphicsView. Я обновил ответ. - person Nejat; 29.11.2014
comment
Большое спасибо, теперь у меня нет ошибок. Но когда я нажимаю «Выполнить», у меня не появляется окно. В любом случае я приму ваш ответ, это было очень полезно. - person sh ze; 29.11.2014
comment
@shahdewai Вы не должны создавать экземпляр MainWindow в его конструкторе. Смотрите первую часть ответа. - person Nejat; 29.11.2014