2014-11-29 4 views
0

Я получаю сообщение об ошибке, когда я бегу Qt проект, и я не могу понять, что является причинойErorr при использовании функции QGraphicsScene в Qt

ошибки:

'class MainWindow' has no member named 'setSceneRect' 'class MainWindow' has no member named 'setScene' `mapToScene' was not declared in this scope

код:

mainwindow.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)); 
} 

mainwindow.h:

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

Я не предлагаю вам запускать этот код, он будет потреблять всю вашу память. Вы выделяете память для mainwindow внутри конструктора mainwidow. Вы конструктор вызывает другой конструктор, который вызывает другой abd другой. Вам нужно полностью переписать свой код. – Chernobyl

ответ

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.

+0

Благодарим вас, ответили первые две ошибки, но у меня все еще есть эта ошибка: 'mapToScene 'не был объявлен в этой области. –

+0

Вы также использовали' mapToScene' в своем коде? Я не вижу. – Nejat

+0

Извините, я отредактировал сообщение. Он находится в функции mousePressEvent –

Смежные вопросы