我在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来使用ChessBoard中声明的函数。
但是,我有另一个叫做游戏的课程。在游戏中我有这个功能
void game::setStartBord() {
scene->setInitialPositions();
}
它只需要启动scene->setInitialPositions();
但是,我无法访问那里的'scene-variable'。我试图继承ChessBoard和MainWindow类,试图使场景全局化,但没有一个真的是一个很好的解决方案。
我该怎么办?完整的代码在这里可见:https://github.com/UA-Niel/chess
您可以使用信号和插槽技术。将您的游戏类对象连接到场景对象。
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();