Russian Qt Forum
Ноябрь 25, 2024, 01:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сцена и слоты  (Прочитано 2410 раз)
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)));
}
Спасибо!
« Последнее редактирование: Февраль 22, 2016, 15:07 от Xambey » Записан
Smogg
Гость
« Ответ #1 : Февраль 24, 2016, 22:44 »

делай setVisible(true/false). Так будет работать, хотя бага и не объясняет)
Записан
Xambey
Гость
« Ответ #2 : Февраль 24, 2016, 23:30 »

Спасибо, еще идеи есть? )
Записан
Smogg
Гость
« Ответ #3 : Февраль 24, 2016, 23:49 »

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

Кароч, не видно отсюда, что на самом деле творится.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.058 секунд. Запросов: 21.