我在两个文件中有两个不同的类:
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
内,其功能是启动新游戏
可以这样做吗?
答案 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()));