[英]Accessing Outside of a class
我試圖在課堂之外訪問 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();
這對我有用。 由於您的情況下的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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.