使用MainWindow Qt中声明的变量

问题描述 投票:0回答:1

我在Qt中遇到以下问题,我正在尝试制作国际象棋,我遇到了一些问题:

在类mainwindow中,我有以下功能:

    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    scene = new ChessBoard;
    QGraphicsView *view = new QGraphicsView(scene);
    setCentralWidget(view);
    connect(scene,SIGNAL(clicked(int,int)),this,SLOT(clicked(int,int)));

    //!!!!!!!!!!
    scene->setInitialPositions();
}

我有一个变量场景,场景是ChessBoard类的一个对象。在全班主窗口中,我可以使用scene-variable来使用C​​hessBoard中声明的函数。

Examples of functions

但是,我有另一个叫做游戏的课程。在游戏中我有这个功能

void game::setStartBord() {
   scene->setInitialPositions();
}

它只需要启动scene->setInitialPositions();

但是,我无法访问那里的'scene-variable'。我试图继承ChessBoard和MainWindow类,试图使场景全局化,但没有一个真的是一个很好的解决方案。

我该怎么办?完整的代码在这里可见:https://github.com/UA-Niel/chess

c++ qt class inheritance
1个回答
0
投票

您可以使用信号和插槽技术。将您的游戏类对象连接到场景对象。

connect(game, &Game::mySignal, scene, &ChessBoard::setInitialPositions);

在游戏类中定义信号。

class Game .. {

.. 

signals: 
void mySignal();

..
};

然后在公共插槽中的ChessBorard类中定义setInitialPositions。

class ChessBoard {

...

public slots:
   <datatype> setInitialPositions();

};

然后用

emit mySignal(); from Game class

在你的ChessBoad课程中执行setIntialPositions()

您需要设计可以在某个时刻访问这两个对象的代码。大多数情况下,这是MainWindow,因为您在程序启动时初始化类。

如果您的代码不依赖于初始化类。你可以在Game类中简单地做一个新的ChessBoard对象

ChessBoard myObject;
myObject.setIntialPositions();
© www.soinside.com 2019 - 2024. All rights reserved.