簡體   English   中英

在課堂外訪問

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM