如何连接两个类之间的函数

时间:2016-06-09 21:29:18

标签: c++ qt class connection qt5

我在两个文件中有两个不同的类:

class Game: public QGraphicsView()

class Window: public QMainWindow()
{
 public: Window(); 
              Game *game;

 public slots: void test() {game = new Game();};
}

Window.cpp中我使用test()函数开始一个新游戏:

Window::Window() {test();}

现在在Game.cpp我创建了一个QMessageBox,其中包含两个QPushButton

    QMessageBox *box= new QMessageBox();

    QPushButton *btYES = box->addButton(tr("YES"),QMessageBox::ActionRole);
    QPushButton *btNO = box->addButton(tr("NO"),QMessageBox::ActionRole);

    box->exec();

    if (box->clickedButton() == btYES) {Window::test();}
    if (box->clickedButton() == btNO) {close();}

正如您所看到的,我想将test()中的函数btYES连接到Game.cpp内的Window.cpp,但该函数位于regionchanged内,其功能是启动新游戏

可以这样做吗?

2 个答案:

答案 0 :(得分:1)

QPushButton在按下/释放时发出事件

所以你可以将释放的信号连接到插槽:

connect(button, SIGNAL(released()), windowClass, SLOT(handleButton()));

在您的情况下,您需要跨课程发送它,因此您可能需要分两步完成。

在游戏中:

// connect the button to a local slot
connect(btYES, SIGNAL(released()), this, SLOT(handleYesButton()));

// in the slot emit a signal - declare the signal in the header
game::handleYesButton()
{
   emit userChoiceYes();
}

在窗口中

// connect the signal in game to a your slot:
connect(game, SIGNAL(userChoiceYes()), this, SLOT(test()));

然后当按下/释放btnYes时,释放信号 - 你在handleYesButton()中选择它并发出你自己的信号,你的窗口类连接到它并在test()中处理它

答案 1 :(得分:0)

基于@code_fodder的答案,但你甚至不需要另一个插槽,加上QPushButton的基本信号是clicked()。这是documentation

  

当按钮激活时,按钮会发出clicked()信号   鼠标,空格键或键盘快捷键。 连接此信号   执行按钮的操作。按钮也提供更少   常用信号,例如按下()已发布()

首先,不要在课程Game中添加其他插槽,只需将按钮的信号clicked()连接到另一个信号:

connect(btYES, SIGNAL(clicked()), this, SIGNAL(btYesClicked()));

当您按下按钮Game时,会发出来自班级btYes的信号。现在,您只需将此信号连接到班级test() 中的广告位Window

connect(game, SIGNAL(btYesClicked()), this, SLOT(test()));