Russian Qt Forum

Qt => Общие вопросы => Тема начата: PavelVX от Август 25, 2011, 12:39



Название: Как получить значение переменной главного окна??
Отправлено: PavelVX от Август 25, 2011, 12:39
Добрый день!
Сильно извиняюсь за ламерский вопрос, но что-то запутался :(
Переделываю пример про доквиджет приложение.
В mainwindow.h сделал
public tvar;

В mainwindow.cpp создаю док окно.
    QDockWidget *dock = new QDockWidget(tr("Customers"), this);
    MyWidget = new MyWidget(dock);
    dock->setWidget(MyWidget);
    addDockWidget(Qt::RightDockWidgetArea, dock);
tvar = 123;

Как мне потом, в методах MyWidget получить tvar???
MyWidget->parent()->parent()->tvar - ругается, что в общем-то правильно :)




Название: Re: Как получить значение переменной главно&#
Отправлено: pokidoff от Август 25, 2011, 12:46
А как насчет в классе MyWidget описать метод void setTVAR(int & tvar)?
По-другому ты никак не доберешься до нее.


Название: Re: Как получить значение переменной главного окна??
Отправлено: PavelVX от Август 25, 2011, 12:51
Все. конец рабочего дня, походу где-то торможу, но если честно, то не понял, зачем :)
Поясню, что я хочу.
При определенных действиях MyWidget должен проверить открыт ли другой виджет, и если открыт, то послать ему сигнал, обновить данные.


Название: Re: Как получить значение переменной главного окна??
Отправлено: GreatSnake от Август 25, 2011, 13:08
Код
C++ (Qt)
qobject_cast< MainWindow* >( MyWidget->window() )->tvar


Название: Re: Как получить значение переменной главного окна??
Отправлено: Странник от Август 25, 2011, 15:47
зачем MyWidget что-то проверять? пусть шлет сигнал в любом случае. если другой виджет существует - он его примет и сам уже решит, обновлять ему данные или нет.


Название: Re: Как получить значение переменной главного окна??
Отправлено: PavelVX от Август 26, 2011, 07:19
GreatSnake, огромное спасибо! век живи, век учись :)
Странник, вы как всегда правы! Слоты/сигналы именно для этого и сделаны. Но как тогда правильнее реализовать архитектуру?
Условия:
1. основное окно, через него открываются все док-виджеты.
2. док-виджет, форма информации о клиентах
3. док виджет, форма информации об операциях клиентов.
Первоначально открываем форму информации о клиентах. При смене клиента генерим сигнал.
Потом открываем информацию об операциях. Привязываем слот изменения клиента с сигналом об этом. В данном варианте все просто.
А если я открою все формы наоборот, то как это делать? Слот же я не могу привязать к пустому указателю! А потом этому указателю присвоить значение на новую форму.


Название: Re: Как получить значение переменной главного окна??
Отправлено: Странник от Август 26, 2011, 09:00
не знаю, стоит ли такие окна размещать в доках, но вам виднее. коннект, разумеется, надо делать, когда обе формы уже созданы. просто в главном окне, когда создаете форму клиентов, проверяете, существует ли форма операций. если существует - коннектите сигнал-слот. ну и наоборот, если при создании формы операций уже существует форма клиентов - коннектите. при удалении одной из форм соединение разрывается автоматически, поэтому повторных коннектов не будет.


Название: Re: Как получить значение переменной главного окна??
Отправлено: PavelVX от Август 26, 2011, 11:00
именно так и сделал, а на вопрос с повторными коннектами вы уже дали ответ.


Название: Re: Как получить значение переменной главного окна??
Отправлено: PavelVX от Август 26, 2011, 12:29
а никто не подскажет, почему не генерируется сигнал destroy?:
Код:
        QDockWidget *dock = new QDockWidget(tr("MyDock"), this);
        myWidget = new QmyWidget(dock);
        dock->setWidget(myWidget);
        addDockWidget(Qt::LeftDockWidgetArea, dock);
        connect(myWidget, SIGNAL(destroyed()), myGlobal, SLOT(myWidgetClose()));
До того, как myWidget стал встраиваться в докпанель, данный код работал исправно. Или надо другой сигнал цеплять на случай закрытия данного виджета?


Название: Re: Как получить значение переменной главного окна??
Отправлено: Странник от Август 26, 2011, 12:46
док-виджет при закрытии не уничтожается, судя по всему. соответственно, и ваш виджет тоже. можно попробовать:
Код:
QDockWidget *dock = new QDockWidget(tr("MyDock"), this);
dock->setAttribute(Qt::WA_DeleteOnClose);