Проблема с кнопками (Qt)
Nedname Дата: Среда, 25 Марта 2015, 14:00 | Сообщение # 1
был не раз
Сейчас нет на сайте
Всем привет! Возникла проблема с кнопками Qt. Файл main.cpp:
Код
#include <QApplication> #include "main_menu.hpp" int main(int argc, char *argv[]) { QApplication game(argc, argv); MainMenu MyMainMenu; MyMainMenu.actionsButtons(); MyMainMenu.showMainMenu(); return game.exec(); }
файл main_menu.hpp
Код
#ifndef MAIN_MENU_HPP #define MAIN_MENU_HPP #include <QPushButton> #include <QHBoxLayout> class MainMenu { public: MainMenu(); ~MainMenu(); void showMainMenu(); void actionsButtons(); private: QWidget *window; QPushButton *beginButton; QPushButton *authorsButton; QPushButton *closeButton; QHBoxLayout *layout; }; #endif // MAIN_MENU_HPP
файл main_menu.cpp
Код
#include <QApplication> #include <QPushButton> #include <QHBoxLayout> #include "main_menu.hpp" MainMenu::MainMenu() { MainMenu::window = new QWidget(); MainMenu::beginButton = new QPushButton("Начать игру"); MainMenu::authorsButton = new QPushButton("Авторы"); MainMenu::closeButton = new QPushButton("Выйти"); MainMenu::layout = new QHBoxLayout; } MainMenu::~MainMenu() { delete MainMenu::window; } void MainMenu::showMainMenu() { window->setWindowTitle("Pirates The Game"); layout->addWidget(beginButton); layout->addWidget(authorsButton); layout->addWidget(closeButton); window->setLayout(layout); window->show(); } void actionsButtons() { QObject::connect(MainMenu::closeButton, SIGNAL(clicked()), &game, SLOT(quit())); }
Как передать функции actionsButtons QApplication game?
IUnknown Дата: Среда, 25 Марта 2015, 17:42 | Сообщение # 2
был не раз
Сейчас нет на сайте
Цитата Nedname (
)
Как передать функции actionsButtons QApplication game?
Делаешь интерфейс к игре (функции, которые будут использовать другие из игры, например, менять состояние) и передаешь его в MainMenu. Либо глобальная переменная, но это же плохо
Snake174 Дата: Среда, 25 Марта 2015, 17:47 | Сообщение # 3
участник
Сейчас нет на сайте
Используй глобальную переменную qAppДобавлено (25 марта 2015, 17:47) --------------------------------------------- Используй глобальную переменную qApp
Не следует обманывать инспектора Pipmak Assistant Love2D Exporter Love2D-Helpers Old Consoles Games
Nedname Дата: Четверг, 26 Марта 2015, 17:30 | Сообщение # 4
был не раз
Сейчас нет на сайте
Цитата Snake174 (
)
Делаешь интерфейс к игре
А можно код привести, что-то я не совсем понял.
HPlusDiese Дата: Четверг, 26 Марта 2015, 18:14 | Сообщение # 5
участник
Сейчас нет на сайте
Singleton же. И обращайся к инстансу. Паттерны - не, не слышал.
Snake174 Дата: Пятница, 27 Марта 2015, 09:15 | Сообщение # 6
участник
Сейчас нет на сайте
Цитата
Используй глобальную переменную qApp
Код
QObject::connect(MainMenu::closeButton, SIGNAL(clicked()), qApp, SLOT(quit()));
Не помню какой слот отвечает за закрытие, но closeAllWindows() точно есть. Цитата
Singleton же. И обращайся к инстансу.
qApp и есть глобальная статичная переменная Код
MainMenu::window = new QWidget(); ...
Первый раз вижу чтобы так писали
Не следует обманывать инспектора Pipmak Assistant Love2D Exporter Love2D-Helpers Old Consoles Games
Nedname Дата: Пятница, 27 Марта 2015, 09:30 | Сообщение # 7
был не раз
Сейчас нет на сайте
Цитата Snake174 (
)
Первый раз вижу чтобы так писали
А как нужно? Цитата Snake174 (
)
Используй глобальную переменную qApp
Т.е. мне нужно объявить QApplication game(argc, argv) вне int main() ? Но тогда откуда брать аргументы arc и argv ?
Snake174 Дата: Пятница, 27 Марта 2015, 10:05 | Сообщение # 8
участник
Сейчас нет на сайте
Хотя бы просто window = new QWidget(); Цитата
Т.е. мне нужно объявить QApplication game(argc, argv) вне int main()?
Ничего не нужно объявлять. Замени Код
QObject::connect(MainMenu::closeButton, SIGNAL(clicked()), &game, SLOT(quit()));
на Код
QObject::connect(MainMenu::closeButton, SIGNAL(clicked()), qApp, SLOT(quit()));
и всё.
Не следует обманывать инспектора Pipmak Assistant Love2D Exporter Love2D-Helpers Old Consoles Games
Nedname Дата: Пятница, 27 Марта 2015, 21:41 | Сообщение # 9
был не раз
Сейчас нет на сайте
Snake174 , спасибо!
IUnknown Дата: Суббота, 28 Марта 2015, 19:29 | Сообщение # 10
был не раз
Сейчас нет на сайте
Цитата Nedname (
)
А можно код привести, что-то я не совсем понял.
Интерфейс - класс с объявленными чисто виртуальными функциями же :) Это что-то подобное, но смысл передаёт: Код
struct IGame { virtual void Update(void) = 0; }; class CGame : public IGame { public: void Update(void); }; void CGame::Update(void) { } int main(int, char**) { IGame *pGame = new CGame(); pGame->Update(); delete pGame; return 0; }
В итоге используется только интерфейс, хранишь просто указатель на него. Но если немного подшаманить, то можно много чего сделать.
Nedname Дата: Суббота, 28 Марта 2015, 21:27 | Сообщение # 11
был не раз
Сейчас нет на сайте
Цитата IUnknown (
)
Интерфейс - класс с объявленными чисто виртуальными функциями же
Это я знаю. Просто не понятно было, как реализовать Ваш способ.