Привет, всем кто откликнулся)
Ситуация: есть сцена (System) на которую помещается qwidget Menu.
В начале в меню располагается 3 кнопки(Button); новая игра, загрузить игру и выход
при нажатии новая игра срабатывает слот смены(PressedNewGameButton), который удаляет текущие кнопки и ставит новые. P.s они инициализированны заранее. Здесь все ОК.
Теперь меню выглядит как 3 кнопки
игра двух игроков, против пк, и НАЗАД.
Последняя и явл-ся проблемой
ПРоблема:
при нажатии на кнопку назад, срабатывает второй слот смены(PressedBack), срабатывает точно(дебажил), НО
он не удаляет кнопки с восстановлением прошлой 'компоновки' ,
ЧТо я делаю не так?
Меню:
#ifndef MENU_H
#define MENU_H
#include <QtWidgets>
#include <button.h>
class Menu: public QWidget
{
Q_OBJECT
private:
QGraphicsScene* scene;
QPixmap pxt;
QVBoxLayout* vertical_1;
//QVBoxLayout* vertical_0;
//QVBoxLayout* vertical_2;
QHBoxLayout* horizontal;
//buttons
Button* ExitFromGame;
Button* NewGame;
Button* LoadGame;
Button* GameWithTwoPlayers;
Button* GameVsPc;
Button* Back;
void SetPalette();
public:
Menu(QGraphicsScene* scene);
QSize GetSizeMenu();
QPushButton* GetButtonForExit();
QPushButton* GetButtonForNewGame();
QPushButton* GetBackButton();
public slots:
void PressedNewGameButton(bool);
void PressedBack(bool);
};
#endif // MENU_H
#include <QtWidgets>
#include "menu.h"
Menu::Menu(QGraphicsScene*scene)/*:vertical_2(0)*/
{
this->scene = scene;
SetPalette();
horizontal = new QHBoxLayout;
vertical_1 = new QVBoxLayout;
NewGame = new Button("&Новая игра");
LoadGame = new Button("&Загрузить игру");
ExitFromGame = new Button("&Выход");
Back = new Button("Назад");
GameWithTwoPlayers = new Button("2 Игрока");
GameVsPc = new Button("Против компьютера");
vertical_1->setMargin(20);
vertical_1->setSpacing(30);
vertical_1->addWidget(NewGame);
vertical_1->addWidget(LoadGame);
vertical_1->addWidget(ExitFromGame);
//horizontal->addLayout(vertical_0);
horizontal->addLayout(vertical_1);
horizontal->setAlignment(vertical_1,Qt::AlignRight);
setLayout(horizontal);
}
void Menu::SetPalette()
{
pxt.load("background.png");
QPalette pal;
pal.setBrush(backgroundRole(),pxt);
setPalette(pal);
resize(1200,800);
autoFillBackground();
}
QSize Menu::GetSizeMenu()
{
return pxt.size();
}
QPushButton *Menu::GetButtonForExit()
{
return ExitFromGame;
}
QPushButton *Menu::GetButtonForNewGame()
{
return NewGame;
}
QPushButton *Menu::GetBackButton()
{
return Back;
}
void Menu::PressedNewGameButton(bool)
{
vertical_1->removeWidget(NewGame);
vertical_1->removeWidget(LoadGame);
vertical_1->removeWidget(ExitFromGame);
vertical_1->addWidget(GameWithTwoPlayers);
vertical_1->addWidget(GameVsPc);
vertical_1->addWidget(Back);
}
void Menu::PressedBack(bool)
{
vertical_1->removeWidget(GameWithTwoPlayers);
vertical_1->removeWidget(GameVsPc);
vertical_1->removeWidget(Back);
vertical_1->addWidget(NewGame);
vertical_1->addWidget(LoadGame);
vertical_1->addWidget(ExitFromGame);
}
Сцена:
#include "system.h"
System::System()
{
View* view = new View(*this);
menu = new Menu(this); //qwidget menu
view->resize(QSize(menu->GetSizeMenu().width(),menu->GetSizeMenu().height())); // set size view = size picture(background) of menu
addWidget(menu);
view->show();
QObject::connect(menu->GetButtonForExit(),SIGNAL(clicked(bool)),view,SLOT(close()));
QObject::connect(menu->GetBackButton(),SIGNAL(clicked(bool)),menu,SLOT(PressedBack(bool)));
QObject::connect(menu->GetButtonForNewGame(),SIGNAL(clicked(bool)),menu,SLOT(PressedNewGameButton(bool)));
}
Спасибо!
делай setVisible(true/false). Так будет работать, хотя бага и не объясняет)
Удаляешь из лейаута, а не из сцены. При вынимании из лейаута тем более надо делать hide(). Насколько помню, лейаут не может быть родителем виджета, только другой виджет..
Кароч, не видно отсюда, что на самом деле творится.