首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用extern关键字时QT程序崩溃

使用extern关键字时QT程序崩溃
EN

Stack Overflow用户
提问于 2021-11-11 09:46:42
回答 1查看 89关注 0票数 1

我试图使用extern关键字为不同的类使用全局对象,但这在QT中是行不通的。

基本上,我想要创建一个公共的GraphicsScene对象,以便在同一个场景中绘制矩形,但在不同的类中绘制矩形。这就是为什么我认为全局对象"scene_“在这里是一个很好的选择。

manwindow.cpp

代码语言:javascript
复制
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

代码语言:javascript
复制
#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

代码语言:javascript
复制
    #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

代码语言:javascript
复制
#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

程序在运行时会立即崩溃。(由于关键字的实现)

代码语言:javascript
复制
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.

我如何解决这个问题,或者有没有其他方法来实现这个问题?

EN

回答 1

Stack Overflow用户

发布于 2021-11-11 12:37:22

为您的设计将工作单一的人持有共同的资源(即现场)。

更好的方法是使用getter将场景声明为MainWindow的私有成员,或者更好地提供addItem()作为公共函数:

代码语言:javascript
复制
void MainWindow::addItem(QGraphicsItem *item)
{
    scene->addItem(item);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69926161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档