访问类外部

Accessing Outside of a class

本文关键字:外部 访问      更新时间:2023-10-16

我正在尝试访问类之外的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"