2016-06-09 2 views
1

У меня есть два разных класса в двух файлах:как подключить функцию между двумя классами

class Game: public QGraphicsView() 

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

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

в Window.cpp я начинаю новую игру, используя тест функции():

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

теперь в Game.cpp I создать 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, и ее функция - начать новую игру.

Это можно сделать?

+1

Похоже, вы хотите создать 'static' функцию. Если да, то это решение: 'static void test() {/*...*/}' – PcAF

+0

'Window :: Window() {Game * game = new Game();}' <= Вы создаете новая локальная переменная называется 'game'. 'void test() {game = new Game();};' <= Вы инициализируете переменную-член, называемую 'game'. Выглядит потенциально опасно, это специально? – thuga

+0

Хорошо, извините, я совершил ошибку. Я объявил {Game * game} в классе Window.h публично: –

ответ

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() и излучать свой собственный сигнал, который ваш класс окна подключен и обрабатывает его в тесте()

0

На основании ответа @code_fodder, но вам даже не нужен еще один слот, а также базовый сигнал для QPushButt сверху есть clicked(). Вот documentation:

нажимная кнопка выдает сигнал нажатия(), когда активируется мыши, пробелом или с помощью клавиш. Подключите к этому сигналу , чтобы выполнить действие кнопки. Нажимные кнопки также обеспечивают минус обычно используемые сигналы, например прессованные() и освобождены().

Для начала, вместо того, чтобы добавить еще один слот в классе Game, просто подключить сигнал clicked() кнопки на другой сигнал:

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

Сигнал из класса Game теперь испускается при нажатии кнопка btYes.Теперь, вы просто должны подключить этот сигнал к слоту test() в классе Window:

connect(game, SIGNAL(btYesClicked()), this, SLOT(test())); 
Смежные вопросы