2015-11-03 223 views
-2

我想在课堂以外访问QgraphicsView的场景。当我创建一个从QGraohicsView派生的类时,我通常可以这样做,但是此类是从QMainWIndow派生的MainWindow,并且我可以扩展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的场景?

**主窗口具有公共变量

 QGraphicsScene *scene; 
     QGraphicsView * view; 

在MainWindow.cpp

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

多重继承。 C++中的一个知识。 – Olaf

+0

抱歉,我并不是想要添加c,habbits :( –

+0

)告诉我们你想解决什么问题。不要问如何使非工作解决方案工作 - 你现在明显知道他们不工作。 't很明白你的问题是什么,显然'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"