Russian Qt Forum

Qt => Общие вопросы => Тема начата: Wander от Март 04, 2009, 10:52



Название: Статус виджета на другой форме
Отправлено: Wander от Март 04, 2009, 10:52
Можно проверить из главной формы, что там с виджетом на другой форме ???

Например, на другой форме есть CheckBox или comboBox нужно проверить - включен флажок или нет или какой текст сейчас в выпадающем списке ???

Так можно?


Название: Re: Статус виджета на другой форме
Отправлено: spirit от Март 04, 2009, 10:56
распривать нутро другого виджета и передавай на него указатель, но, имхо, это неверно. либо сделать френдовую связь. лучше враперов накатать.


Название: Re: Статус виджета на другой форме
Отправлено: lit-uriy от Март 04, 2009, 11:07
В Qt используется другой подход: Слоты и сигналы, при изменении состояния флажка посылается сигнал, соедени его с нужным слотом.


Название: Re: Статус виджета на другой форме
Отправлено: spirit от Март 04, 2009, 11:12
В Qt используется другой подход: Слоты и сигналы, при изменении состояния флажка посылается сигнал, соедени его с нужным слотом.
это частный случай. всю инфу в этом случае через sender получить можно. но как я понял нужно одновременно получить доступ к виджетам, т.е. есть метод в котором нужно проверить не только флажки, но и получить (тут же) строку из лайнэдита.


Название: Re: Статус виджета на другой форме
Отправлено: Wander от Март 04, 2009, 11:44
Я так понял -  изящно и просто проверить, что лежит в другой форме нельзя.
Тода как же реализуют в приложениях форму "Свойств/Опций" программы ???
Когда юзер выставил опции, то как же проверять какие там опции (или делать все в одной форме?).
Или же мне записывать все в текстовый файл, а потом из главной формы читать этот файл ???

   


Название: Re: Статус виджета на другой форме
Отправлено: spirit от Март 04, 2009, 11:47
зачем? для опций обычно создают дилог. этот далог вызывают в главном окне. затем
Код
C++ (Qt)
...
if (!dialog.exec())
  return;
//считываем опции.
 


Название: Re: Статус виджета на другой форме
Отправлено: Wander от Март 04, 2009, 11:50
Ой - ой - а можно поподробнее, как считать опции (ведь опции это всего текстовые метки в соответствии к которым что-то меняется)


Название: Re: Статус виджета на другой форме
Отправлено: spirit от Март 04, 2009, 11:58
ну я ж говорил, при помощи враперов. допустим есть на форме 2 лайнэдита и два чекбокса, то код будет приблизительно таким
Код
C++ (Qt)
class Dialog: public QDialog
{
  Q_OBJECT
...
public:
   QString lineEditText1() const { return m_leLineEdit1->text(); }
   QString lineEditText2() const { return m_leLineEdit2->text(); }
 
   bool flag1() const { return m_cbCheckBox1->isChecked(); }
   bool flag2() const { return m_cbCheckBox2->isChecked(); }
 
private:
   QLineEdit *m_leLineEdit1;
   QLineEdit *m_leLineEdit2;
 
   QCheckBox *m_cbCheckBox1;
   QCheckBox *m_cbCheckBox2;
};
...
if (!dialog.exec())
  retrun;
...
const QString text1 = dialog.lineEditText1();
const QString text2 = dialog.lineEditText2();
bool flag1 = dialog.flag1();
bool flag2 = dialog.flag2();
...
 

а если надо сохранить эти настройки, то можно либо перегрузить метод accept() диалога и все сохранять в файл, либо же в сохранять в виджете (после exec()) в окне, которое вызывает твой диалог.


Название: Re: Статус виджета на другой форме
Отправлено: lit-uriy от Март 04, 2009, 12:09
а можно и подругому, некий виджет (форма, например) предоставляет интерфейс к настройкам себя, и по сути, ты вызываешь диалог либо предоставляемый этим виджетом, либо в чужем дмалоге высвечивается список свойств, который определенным образом предоставляет настраиваемый виджет (например выдет QMap, который редактирует пользователь).

А вот над интерфейсом надо самому подумать.


Название: Re: Статус виджета на другой форме
Отправлено: spirit от Март 04, 2009, 12:12
можно и так. тогда можно заюзать QObject::setProperty/property


Название: Re: Статус виджета на другой форме
Отправлено: Wander от Март 04, 2009, 12:22
У меня куча ошибок полезло  :'(

Если не трудно  - конечно же, исходники все бы решили.
А то я тут вам голову морочу.
 


Название: Re: Статус виджета на другой форме
Отправлено: BRE от Март 04, 2009, 12:39
Например так. Есть главное окно и несколько окошек с опцями:
Код
C++ (Qt)
class MainWindow : public QMainWindow
{
   ....
private:
   FirstOptionWidget      *m_firstOptions;
   SecondOptionWidget *m_secondOptions;
};
 
// Доступ к опциям
void MainWindow::changedFirstOption()
{
  bool o1 = m_firstOptions->options1;
  QString option2 = m_firstOptions->strintOption();
 
  m_firstOptions->setData( "text" );
}
 

Еще в окнах опций можно сделать сигнал, который будет посылаться при изменении одной из опций или сделать кнопку "Обновить" и ловить его в MainWindow, выбирать нужные параметры и обновляться.


Название: Re: Статус виджета на другой форме
Отправлено: spirit от Март 04, 2009, 12:40
ну смотри, перегружаешь accept в своем диалоге. в этом методе сетаешь состояние всех своих веджетов через setProperty. затем в вызывающем окне получаешь значения через property. можно их запихнуть в QMap<QString, QVaraint> и потом сохранить в файл (если нужно конечно). получить список всех свойст, которые были динамически добавлены можно через QList<QByteArray> QObject::dynamicPropertyNames () const. получится очень гибкая реализация.