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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как получить значение переменной главного окна??  (Прочитано 4938 раз)
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 - ругается, что в общем-то правильно Улыбающийся


Записан
pokidoff
Гость
« Ответ #1 : Август 25, 2011, 12:46 »

А как насчет в классе MyWidget описать метод void setTVAR(int & tvar)?
По-другому ты никак не доберешься до нее.
« Последнее редактирование: Август 25, 2011, 12:50 от pokidoff » Записан
PavelVX
Гость
« Ответ #2 : Август 25, 2011, 12:51 »

Все. конец рабочего дня, походу где-то торможу, но если честно, то не понял, зачем Улыбающийся
Поясню, что я хочу.
При определенных действиях MyWidget должен проверить открыт ли другой виджет, и если открыт, то послать ему сигнал, обновить данные.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Август 25, 2011, 13:08 »

Код
C++ (Qt)
qobject_cast< MainWindow* >( MyWidget->window() )->tvar
Записан

Qt 5.11/4.8.7 (X11/Win)
Странник
Гость
« Ответ #4 : Август 25, 2011, 15:47 »

зачем MyWidget что-то проверять? пусть шлет сигнал в любом случае. если другой виджет существует - он его примет и сам уже решит, обновлять ему данные или нет.
Записан
PavelVX
Гость
« Ответ #5 : Август 26, 2011, 07:19 »

GreatSnake, огромное спасибо! век живи, век учись Улыбающийся
Странник, вы как всегда правы! Слоты/сигналы именно для этого и сделаны. Но как тогда правильнее реализовать архитектуру?
Условия:
1. основное окно, через него открываются все док-виджеты.
2. док-виджет, форма информации о клиентах
3. док виджет, форма информации об операциях клиентов.
Первоначально открываем форму информации о клиентах. При смене клиента генерим сигнал.
Потом открываем информацию об операциях. Привязываем слот изменения клиента с сигналом об этом. В данном варианте все просто.
А если я открою все формы наоборот, то как это делать? Слот же я не могу привязать к пустому указателю! А потом этому указателю присвоить значение на новую форму.
Записан
Странник
Гость
« Ответ #6 : Август 26, 2011, 09:00 »

не знаю, стоит ли такие окна размещать в доках, но вам виднее. коннект, разумеется, надо делать, когда обе формы уже созданы. просто в главном окне, когда создаете форму клиентов, проверяете, существует ли форма операций. если существует - коннектите сигнал-слот. ну и наоборот, если при создании формы операций уже существует форма клиентов - коннектите. при удалении одной из форм соединение разрывается автоматически, поэтому повторных коннектов не будет.
Записан
PavelVX
Гость
« Ответ #7 : Август 26, 2011, 11:00 »

именно так и сделал, а на вопрос с повторными коннектами вы уже дали ответ.
Записан
PavelVX
Гость
« Ответ #8 : Август 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 стал встраиваться в докпанель, данный код работал исправно. Или надо другой сигнал цеплять на случай закрытия данного виджета?
Записан
Странник
Гость
« Ответ #9 : Август 26, 2011, 12:46 »

док-виджет при закрытии не уничтожается, судя по всему. соответственно, и ваш виджет тоже. можно попробовать:
Код:
QDockWidget *dock = new QDockWidget(tr("MyDock"), this);
dock->setAttribute(Qt::WA_DeleteOnClose);
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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