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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QStackedWidget  (Прочитано 8173 раз)
alexlogvinenkoit
Гость
« : Октябрь 13, 2011, 12:45 »

Доброе время суток!

Сразу к делу: есть в программе 1 класс, наследующийся от QStackedWidget, есть 15 классов, наследующихся от QWidget...
Потом, естественно, в классе, наследующимся от QStackedWidget созданы объекты этих классов и добавлены в него...

Так вот, как можно сделать так, чтобы можно было вызывать метод QStackedWidget::setCurrentIndex(int index) из этих 15-ти классов?

Заранее спасибо!
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Октябрь 13, 2011, 12:49 »

Код
C++ (Qt)
qobject_cast< QStackedWidget* >( parentWidget() )->setCurrentWidget( this );
Записан

Qt 5.11/4.8.7 (X11/Win)
alexlogvinenkoit
Гость
« Ответ #2 : Октябрь 13, 2011, 13:16 »

Не сработало...
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Октябрь 13, 2011, 13:20 »

Не сработало...
Показывай код.
Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #4 : Октябрь 13, 2011, 13:23 »

GreatSnake  не посмотрите темку?
http://www.prog.org.ru/topic_19684_0.html
Записан
alexlogvinenkoit
Гость
« Ответ #5 : Октябрь 13, 2011, 13:45 »

Код:
class WidgetStacked : public QStackedWidget
{
    Q_OBJECT
public:
    explicit WidgetStacked(QWidget *parent = 0)
    {
        this->wgtOpenEnter = new WidgetOpenEnter(this);
        this->addWidget(this->wgtOpenEnter);
        //Создание и добавление кучи других виджетов...
        this->setCurrentIndex(0);       
    }

private:
    WidgetOpenEnter * wgtOpenEnter;
    //Куча других виджетов
};

Код:
class WidgetOpenEnter : public QWidget
{
    Q_OBJECT
public:
    explicit WidgetOpenEnter(QWidget *parent = 0)
    {
        this->btn1 = new QPushButton(QString::fromUtf8("Кнопка 1"));
        this->btn1->setObjectName(QString("Button1"));
        connect(this->btn1, SIGNAL(clicked()), this, SLOT(ButtonClick()));

        this->btn2 = new QPushButton(QString::fromUtf8("Кнопка 2"));
        this->btn2->setObjectName(QString("Button2"));
        connect(this->btn2, SIGNAL(clicked()), this, SLOT(ButtonClick()));

        this->btn3 = new QPushButton(QString::fromUtf8("Кнопка 3"));
        this->btn3->setObjectName(QString("Button3"));
        connect(this->btn3, SIGNAL(clicked()), this, SLOT(ButtonClick()));

        /*... Дальше помещаю в QVBoxLayout и т.д. */
    }

private slots:
    void ButtonClick()
    {
        if(sender()->objectName() == QString("Button1"))
        {
            //Вот тут и надо менять индекс текущего виджета
        }
        //else if ...
    }
private:
    QPushButton * btn1, * btn2, * btn3;
};
« Последнее редактирование: Октябрь 13, 2011, 13:56 от Пантер » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Октябрь 13, 2011, 14:00 »

Не вижу добавления >1 виджета на QStackedWidget.

Попробуй так:
Код
C++ (Qt)
template< typename T > T QUFindParent( QObject* o )
{
while( o )
{
if( T po = qobject_cast< T >( o ) )
return po;
o = o->parent();
}
return 0;
}
void ButtonClick()
{
       if(sender()->objectName() == QString("Button1"))
       {
           //Вот тут и надо менять индекс текущего виджета
           if( QStackedWidget* sw = QUFindParent< QStackedWidget* >( sender() ) )
             if( WidgetOpenEnter* w = QUFindParent< WidgetOpenEnter* >( sender() ) )
               sw->setCurrentIndex( w );
       }
       //else if ...
}
 

PS. здесь теги поддерживаются только в []
Записан

Qt 5.11/4.8.7 (X11/Win)
alexlogvinenkoit
Гость
« Ответ #7 : Октябрь 13, 2011, 14:10 »

Спасибо, я придумал иначе, в конструктор виджетов добавляю указатель на QStackedWidget и при создании объектов в конструкторе QStackedWidget - передаю параметром this...

Код:
class Widget : public QWidget
{
Q_OBJECT
public:
    explicit Widget (QStackedWidget * sw, QWidget * parent = 0)
    {
        this->sw = sw;
    }
private:
    QStackedWidget * sw;
}

Или лучше использовать Ваш вариант?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Октябрь 13, 2011, 14:12 »

Зачем передавать QStackedWidget, если и так есть parent?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
alexlogvinenkoit
Гость
« Ответ #9 : Октябрь 13, 2011, 14:15 »

Так parent - это QWidget, у него нет методов QStackedWidget, только приводить к типу...
А можно наследоваться от QWidget, а принимать в качестве parent - QStackedWidget?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Октябрь 13, 2011, 14:19 »

У QStackedWidget есть слот setCurrentIndex, лучше пусть твои классы испускают сигнал, который ты завяжешь на этот слот.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
alexlogvinenkoit
Гость
« Ответ #11 : Октябрь 13, 2011, 14:22 »

Супер!
Как испустить сигнал? Я разобрался только как привязать сигнал к слоту...
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #12 : Октябрь 13, 2011, 14:38 »

emit signalName (signalParameters);
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
alexlogvinenkoit
Гость
« Ответ #13 : Октябрь 13, 2011, 14:39 »

Спасибо Улыбающийся
Записан
alexlogvinenkoit
Гость
« Ответ #14 : Октябрь 13, 2011, 14:48 »

GreatSnake, о Вашем преобразовании (qobject_cast<QStackedWidget *>(parentWidget())->setCurrentIndex(...))
Код:
((QStackedWidget *)this->parentWidget())->setCurrentIndex(...);
Так работает, только что проверил...
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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