Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: alexlogvinenkoit от Октябрь 13, 2011, 12:45



Название: QStackedWidget
Отправлено: alexlogvinenkoit от Октябрь 13, 2011, 12:45
Доброе время суток!

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

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

Заранее спасибо!


Название: Re: QStackedWidget
Отправлено: GreatSnake от Октябрь 13, 2011, 12:49
Код
C++ (Qt)
qobject_cast< QStackedWidget* >( parentWidget() )->setCurrentWidget( this );


Название: Re: QStackedWidget
Отправлено: alexlogvinenkoit от Октябрь 13, 2011, 13:16
Не сработало...


Название: Re: QStackedWidget
Отправлено: GreatSnake от Октябрь 13, 2011, 13:20
Не сработало...
Показывай код.


Название: Re: QStackedWidget
Отправлено: Bepec от Октябрь 13, 2011, 13:23
GreatSnake  не посмотрите темку?
http://www.prog.org.ru/topic_19684_0.html


Название: Re: QStackedWidget
Отправлено: alexlogvinenkoit от Октябрь 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;
};


Название: Re: QStackedWidget
Отправлено: GreatSnake от Октябрь 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. здесь теги поддерживаются только в []


Название: Re: QStackedWidget
Отправлено: alexlogvinenkoit от Октябрь 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;
}

Или лучше использовать Ваш вариант?


Название: Re: QStackedWidget
Отправлено: Пантер от Октябрь 13, 2011, 14:12
Зачем передавать QStackedWidget, если и так есть parent?


Название: Re: QStackedWidget
Отправлено: alexlogvinenkoit от Октябрь 13, 2011, 14:15
Так parent - это QWidget, у него нет методов QStackedWidget, только приводить к типу...
А можно наследоваться от QWidget, а принимать в качестве parent - QStackedWidget?


Название: Re: QStackedWidget
Отправлено: Пантер от Октябрь 13, 2011, 14:19
У QStackedWidget есть слот setCurrentIndex, лучше пусть твои классы испускают сигнал, который ты завяжешь на этот слот.


Название: Re: QStackedWidget
Отправлено: alexlogvinenkoit от Октябрь 13, 2011, 14:22
Супер!
Как испустить сигнал? Я разобрался только как привязать сигнал к слоту...


Название: Re: QStackedWidget
Отправлено: Пантер от Октябрь 13, 2011, 14:38
emit signalName (signalParameters);


Название: Re: QStackedWidget
Отправлено: alexlogvinenkoit от Октябрь 13, 2011, 14:39
Спасибо :)


Название: Re: QStackedWidget
Отправлено: alexlogvinenkoit от Октябрь 13, 2011, 14:48
GreatSnake, о Вашем преобразовании (qobject_cast<QStackedWidget *>(parentWidget())->setCurrentIndex(...))
Код:
((QStackedWidget *)this->parentWidget())->setCurrentIndex(...);
Так работает, только что проверил...


Название: Re: QStackedWidget
Отправлено: alexlogvinenkoit от Октябрь 13, 2011, 14:56
И еще вопрос... Теперь нужно сделать то же самое, только использовать в функции потока (не Qt, а pthread_t)...
Есть такое:
Код:

int port;
char buffer [8];

void * ThreadCallback(void * param)
{
    while(true)
    {
        int length = read(port, buffer, 8);
        if(length > 0)
        {
            //Operation with serial port
            if(...)
            {
                ((QStackedWidget *)param)->setCurrentIndex(...);
            }
        }
    }
    pthread_exit(0);
    return NULL;
}

Так не получается... Переменная видит только дочерние виджеты, больше ничего...
Можно что-то придумать?


Название: Re: QStackedWidget
Отправлено: Пантер от Октябрь 13, 2011, 15:17
Не нужно использовать сишный каст, используй qobject_cast.