我试图在课堂外访问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的场景吗?
** MainWindow有公共变量
QGraphicsScene *scene;
QGraphicsView * view;
在MainWindow.cpp
scene = new QGraphicsScene(this);
view = new QGraphicsView(scene);
view.show();
答案 0 :(得分: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"