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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как сделать переключение виджетов-слайдов?  (Прочитано 2800 раз)
piro1107
Гость
« : Апрель 15, 2015, 12:34 »

Уважаемые форумчане, помогите с одним делом. Я делаю что-то типа презентации и хочу переключать свои слайды-виджеты. При этом на каждом таком слайде определён сигнал, который привязан к виждету презентации. Собственно код:

Интерфейсов классов:
Код:
#include <QtCore>
#include <QtGui>

class One : public QWidget
{
    Q_OBJECT
public:
    One(QWidget *parent = 0);
public slots:
    void slot_turn();
signals:
    void turn();
};

class Two : public QWidget
{
    Q_OBJECT
public:
    Two(QWidget *parent = 0);
public slots:
    void slot_turn();
signals:
    void turn();
};

class All : public QWidget
{
    Q_OBJECT
private:
    enum Mode {OneMode, TwoMode};
    Mode mode;
    One *w_one;
    Two *w_two;
public:
    All(QWidget *parent = 0);
public slots:
    void slot_turn();
};

Реализации:
Код:
One::One(QWidget *parent)
    : QWidget(parent)
{
    // widget
    QLabel *lbl = new QLabel("One");
    lbl->setMargin(20);

    QPushButton *btn = new QPushButton("Turn");

    // layout
    QVBoxLayout *all = new QVBoxLayout;
    all->addWidget(lbl);
    all->addWidget(btn);

    setLayout(all);

    // signals and slots
    QObject::connect(btn, SIGNAL(released()),
                     this, SLOT(slot_turn()));
}

void One::slot_turn()
{
    emit turn();
}


Two::Two(QWidget *parent)
    : QWidget(parent)
{
    // widget
    QLabel *lbl = new QLabel("Two");
    lbl->setMargin(20);

    QPushButton *btn = new QPushButton("Turn");

    // layout
    QVBoxLayout *all = new QVBoxLayout;
    all->addWidget(lbl);
    all->addWidget(btn);

    setLayout(all);

    // signals and slots
    QObject::connect(btn, SIGNAL(released()),
                     this, SLOT(slot_turn()));
}

void Two::slot_turn()
{
    emit turn();
}


All::All(QWidget *parent)
    : QWidget(parent)
{
    mode = OneMode;

    // widget
    w_one = new One;
    w_two = new Two;

    // layout
    QVBoxLayout *all = new QVBoxLayout;
    all->addWidget(w_one);

    setLayout(all);

    // signals and slots
    QObject::connect(w_one, SIGNAL(turn()),
                     this, SLOT(slot_turn()));
    QObject::connect(w_two, SIGNAL(turn()),
                     this, SLOT(slot_turn()));
}

void All::slot_turn()
{
    if (sender() == w_one) {
        mode = TwoMode;
        layout()->removeWidget(w_one);
        layout()->addWidget(w_two);
    } else {
        mode = OneMode;
        layout()->removeWidget(w_two);
        layout()->addWidget(w_one);
    }
    repaint();
}

А теперь вопрос: почему при смене слайда рисовка старого остаётся?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Апрель 15, 2015, 12:37 »

Советую воспользоваться классом QStackedWidget Подмигивающий
Записан

piro1107
Гость
« Ответ #2 : Апрель 15, 2015, 14:31 »

Советую воспользоваться классом QStackedWidget Подмигивающий

Я знаю про этот виджет, но я решил написать свой велосипед. Чтобы, если условия задачи изменятся и по определённому сигналу из слайда я смог перейти на другой слайд. Самый близкий пример - игра. 3 слайда: сама игра, настройки, меню новой игры.

Даже если гибкость не нужна, то непонятно почему виджет презентации не перерисовывает себя, а накладывает изображение? Просто интересно.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Апрель 15, 2015, 14:41 »

А зачем вы вызываете перерисовку?
Этим виджеты сами занимаются вы ведь не переопределяете paintEvent и не отрисовываете все вручную...

Скрывайте и показывайте виджеты-слайды

Используйте также для кнопок сигнал clicked

Также для
Код
C++ (Qt)
   // signals and slots
   QObject::connect(btn, SIGNAL(released()),
                    this, SLOT(slot_turn()));
 
...
 
void One::slot_turn()
{
   emit turn();
}
 

можно обойтись без слота и сразу же вызывать сигнал:
    QObject::connect(btn, SIGNAL(released()), this, SIGNAL(turn()));
« Последнее редактирование: Апрель 15, 2015, 14:45 от gil9red » Записан

piro1107
Гость
« Ответ #4 : Апрель 15, 2015, 22:12 »

А зачем вы вызываете перерисовку?
Этим виджеты сами занимаются вы ведь не переопределяете paintEvent и не отрисовываете все вручную...

Скрывайте и показывайте виджеты-слайды

Используйте также для кнопок сигнал clicked

Также для
Код
C++ (Qt)
   // signals and slots
   QObject::connect(btn, SIGNAL(released()),
                    this, SLOT(slot_turn()));
 
...
 
void One::slot_turn()
{
   emit turn();
}
 

можно обойтись без слота и сразу же вызывать сигнал:
    QObject::connect(btn, SIGNAL(released()), this, SIGNAL(turn()));

Как я понял вы предлагаете сделать виджет презентацию как слой с набором виждетов, а потом их просто по очереди показывать?

Всё остальное я знал. Просто тренируюсь и пишу белеберду.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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