2015-11-03 6 views
-2

Я пытаюсь открыть сцену QgraphicsView вне класса. Обычно я могу это сделать, когда создаю класс, полученный из QGraohicsView, но этот класс является MainWindow, который происходит из QMainWIndow, и я могу расширить его QGraphicsView, потому что есть конфликт, когда вы вызываете метод .show() в качестве компилятора не знает, какой из них выбрать.Доступ за пределы класса

namespace Ui { 
    class MainWindow; 
    } 
    class MainWindow : public QMainWindow 
     {} 

Так я создаю новый экземпляр QGraphicsView и обнародует его, а также QGraphicsScene и обнародует его.

Тогда во внешнем классе

extern MainWindow * mainwindow 

Но когда я пытаюсь получить доступ к нему, и я получаю неопределенную ссылку ошибку.

mainwindow->view->scene()->addItem(item); or 
mainwindow->mainwindow.scene->addItem(item); 

Ни один из них не работает. Я знаю его разрушающую инкапсуляцию, но в этом конкретном случае нет другого пути.

** Что я пытаюсь сделать, это открыть сцену QgraphicsView вне ее класса?

** MainWindow имеет общие переменные

 QGraphicsScene *scene; 
     QGraphicsView * view; 

В mainwindow.cpp

 scene = new QGraphicsScene(this); 
     view = new QGraphicsView(scene); 
     view.show(); 
+1

множественное наследование. Одна из nastinesses в C++. – Olaf

+0

Извините, я не хотел добавлять c, habbits :( –

+0

Скажите нам, какую проблему вы пытаетесь решить. Не спрашивайте, как работать с неработоспособными решениями - вы, очевидно, уже знаете, что они не работают. Понятно, что 'mainwindow-> view' не будет работать, потому что ваш класс' MainWindow' не имеет члена по этому имени. Сначала покажите реальный код! –

ответ

1

Это работает для меня. Поскольку view в вашем случае был указателем, вы должны получить доступ к его членам через ->, а не .. Но все это лишнее - вы должны как можно больше хранить все по стоимости и позволить компилятору беспокоиться о том, чтобы освободить ресурсы, когда они больше не нужны. Вот почему вы используете C++, а не C, в конце концов.

// https://github.com/KubaO/stackoverflown/tree/master/questions/simple-view-33508582 
#include <QtWidgets> 

class MainWindow : public QMainWindow { 
    Q_OBJECT 
    QGraphicsScene m_scene; 
    QWidget m_central; 
    QGraphicsView m_view; // must be declared after m_central per C++ semantics 
    QGridLayout m_layout; 
public: 
    MainWindow(QWidget * parent = 0) : 
    QMainWindow(parent), 
    m_layout(&m_central) { 
    setCentralWidget(&m_central); 
    m_layout.addWidget(&m_view, 0, 0); 
    m_view.setScene(&m_scene); 
    } 
    QGraphicsScene * scene() { return &m_scene; } 
    QGraphicsView * view() { return &m_view; } 
}; 

int main(int argc, char ** argv) { 
    QApplication app(argc, argv); 
    MainWindow win; 
    win.scene()->addEllipse(0, 0, 10, 10); 
    win.show(); 
    return app.exec(); 
} 

#include "main.moc" 

Вы также должны решить, нужно ли вам в QMainWindow вообще. Просто потому, что шаблон Qt Creator использует его, не означает, что вы также должны использовать его вслепую. Если вы не используете QMainWindow's функциональность док-зона, QDialog будет более разумным базовый класс для использования:

// https://github.com/KubaO/stackoverflown/tree/master/questions/simple-view-33508582 
#include <QtWidgets> 

class MainWindow : public QDialog { 
    Q_OBJECT 
    QGraphicsScene m_scene; 
    QGraphicsView m_view; 
    QGridLayout m_layout; 
public: 
    MainWindow(QWidget * parent = 0) : 
    QDialog(parent), 
    m_layout(this) { 
    m_layout.addWidget(&m_view, 0, 0); 
    m_view.setScene(&m_scene); 
    } 
    QGraphicsScene * scene() { return &m_scene; } 
    QGraphicsView * view() { return &m_view; } 
}; 

int main(int argc, char ** argv) { 
    QApplication app(argc, argv); 
    MainWindow win; 
    win.scene()->addEllipse(0, 0, 10, 10); 
    win.show(); 
    return app.exec(); 
} 

#include "main.moc" 
Смежные вопросы