【问题标题】:Use variable declared in MainWindow Qt使用在 MainWindow Qt 中声明的变量
【发布时间】:2018-06-09 11:47:10
【问题描述】:

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

在类 ma​​inwindow 我有以下功能:

    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 类的对象。 在整个类 ma​​inwindow 中,我可以使用场景变量来使用 ChessBoard 中声明的函数。

但是,我还有一个名为 game 的课程。 在游戏我有这个功能

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

只需启动scene->setInitialPositions();

但是,我无法访问那里的“场景变量”。我尝试继承 ChessBoard 和 MainWindow 类,尝试使场景全局化,但没有一个真正是好的解决方案。

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

【问题讨论】:

  • game 类的确切目的是什么?听起来你需要重新设计你的课程......
  • 您可能希望将 setInitialPositions() 设为插槽。并使用信号和槽让它执行。

标签: c++ qt class inheritance


【解决方案1】:

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

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

在您的 Game-Class 中定义信号。

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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 2017-03-26
    • 2012-09-29
    • 2011-12-12
    • 2013-08-27
    • 1970-01-01
    相关资源
    最近更新 更多