Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Xambey от Февраль 22, 2016, 14:20



Название: Сцена и слоты
Отправлено: Xambey от Февраль 22, 2016, 14:20
Привет, всем кто откликнулся)
Ситуация: есть сцена (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)));
}
Спасибо!


Название: Re: Сцена и слоты
Отправлено: Smogg от Февраль 24, 2016, 22:44
делай setVisible(true/false). Так будет работать, хотя бага и не объясняет)


Название: Re: Сцена и слоты
Отправлено: Xambey от Февраль 24, 2016, 23:30
Спасибо, еще идеи есть? )


Название: Re: Сцена и слоты
Отправлено: Smogg от Февраль 24, 2016, 23:49
Удаляешь из лейаута, а не из сцены. При вынимании из лейаута тем более надо делать hide(). Насколько помню, лейаут не может быть родителем виджета, только другой виджет..

Кароч, не видно отсюда, что на самом деле творится.