我试图使用extern关键字为不同的类使用全局对象,但这在QT中是行不通的。
基本上,我想要创建一个公共的GraphicsScene对象,以便在同一个场景中绘制矩形,但在不同的类中绘制矩形。这就是为什么我认为全局对象"scene_“在这里是一个很好的选择。
manwindow.cpp:
QGraphicsScene *scene_ = new QGraphicsScene();
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
scene_->setSceneRect(-300,-300,600,600);
ui->graphicsView->setScene(scene_);
QGraphicsRectItem *rectItem = new QGraphicsRectItem();
rectItem->setRect(0,0,200,200);
scene_->addItem(rectItem);
}
MainWindow::~MainWindow()
{
delete ui;
}mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QGraphicsScene>
#include <QMainWindow>
extern QGraphicsScene *scene_;
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H 在这里,我希望从mainwindow.h检索相同的对象指针_scene,并向其中添加第二个矩形。
A.c:
#include "a.h"
#include "mainwindow.h"
#include <QGraphicsRectItem>
A::A()
{
QGraphicsRectItem *rectItem2 = new QGraphicsRectItem();
rectItem2->setRect(0,0,200,200);
scene_->addItem(rectItem2);
}main.cpp:
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}程序在运行时会立即崩溃。(由于关键字的实现)
10:17:26: The program has unexpectedly finished.
10:17:26: The process was ended forcefully.
Desktop_Qt_6_2_1_MinGW_64_bit-Debug\debug\test.exe crashed.我如何解决这个问题,或者有没有其他方法来实现这个问题?
发布于 2021-11-11 12:37:22
为您的设计将工作单一的人持有共同的资源(即现场)。
更好的方法是使用getter将场景声明为MainWindow的私有成员,或者更好地提供addItem()作为公共函数:
void MainWindow::addItem(QGraphicsItem *item)
{
scene->addItem(item);
}https://stackoverflow.com/questions/69926161
复制相似问题