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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как обратиться к переменной, определенной в родителе?  (Прочитано 5683 раз)
track
Гость
« : Январь 08, 2007, 11:16 »

Не уверен, что по адресу, т.к. в C++ новичок.

Какие есть способы, когда надо из потомка (QWidget) прочитать текущее значение переменной родителя (QVGroupBox) ?? Речь идет не о наследовании, а о "new QWidget(this);" в конструкторе.

Чего-то сам додуматься не могу :(
Qt 3.3.3
Записан
bigirbis
Гость
« Ответ #1 : Январь 08, 2007, 11:38 »

1. Вариант стандартный - сохранить где-либо указатель на объект.
2. Вариант нестандартный - вот такая штука в Qt3 есть - void * qt_find_obj_child ( QObject * parent, const char * type, const char * name )
Записан
track
Гость
« Ответ #2 : Январь 08, 2007, 14:16 »

Спасибо, теперь дошло :=))
Сделал 1-ым способом.
Записан
Alex03
Гость
« Ответ #3 : Январь 08, 2007, 15:09 »

Цитировать

1. Вариант стандартный - сохранить где-либо указатель на объект.

А чё его сохранять если он QObject * parent()?

Вариант 3 чисто qt-шный:
потомок от (QWidget) генерит сигнал
родитель (QVGroupBox) при создании потомока коннектит его сигнал на свой слот.

ИМХО
Это правильный подход если потомок "говорит о чём то" родителю (у меня тут значение на 23 изменилось).
Если "спрашивает о чём-то" то уже не очень правильно. Улыбающийся Тут может стоит логику поменять.

В общем можно вопрос ещё поконкретней задать. Улыбающийся
Записан
bigirbis
Гость
« Ответ #4 : Январь 08, 2007, 15:24 »

3 вариант не для всей логики подходит, но для многих случаев - согласен. Иногда просто нецелесообразно создавать кучу слотов и запихивать измененные данные в к-л контекст, если значения можно просто получить в одном или нескольких значащих слотах.
Цитировать
А чё его сохранять если он QObject * parent()?

Хождения по парентам и чайлдам в стандартном случае может доставить лишний геморрой, это-то при малом весе указателя. Такой вариант удобен при каком-нибудь генерировании виджетов и пр.
Записан
track
Гость
« Ответ #5 : Январь 08, 2007, 19:30 »

Цитировать
А чё его сохранять если он QObject * parent()?


Вот у меня так не получилось почему-то. Покажите плз, как правильно его использовать.

Сделал так:
Код:

XClock::XClock (XTime *parent, const char *name, WFlags f)
: QWidget(parent, name, f)
{
    xtime = parent;
}

void XClock::paintEvent (QPaintEvent *)
{
    QTime t = xtime->time_;
}


xtime определен как public: Xtime *xtime; а XTime это класс-наследник от QVGroupBox.


PS. - делаю аналог виндовых часов с календариком, которые появляются если тыкнуть на часиках в таскбаре. Хочу себе на линух такие же :=)
По задумке, родительский виджет следит за временем, а в нужые моменты посылает update() в виджет аналоговых часов и в виджет цифровых. Ну и когда они сами перерисовываются, тоже ведь надо брать текущее время -- не по отдельности же в каждом виджете его добывать от системы... Так что 3-ий вариант не подходит.
Записан
Steven_Orko
Гость
« Ответ #6 : Январь 08, 2007, 19:56 »

Возможно тебе это поможет. Я все запихнул в один файл, но ты можешь разбить на два: на заголовочный и на файл реализации (*.h и *.cpp):
Код:

class TSomeClass;


class TParentClass : public QObject
{
Q_OBJECT
public:
TParentClass(QObject * pParent = 0, const char * cName = 0 )
: QObject(pParent, cName), m_pSomeClass(NULL)
{

m_pSomeClass = new TSomeClass(this);
}

virtual ~TParentClass()
{
//Этого можно и не делать
if (NULL != m_pSomeClass) delete m_pSomeClass;
}

QTime mytime() const
{
return m_myTime;
}

public slots:
void setMyTime(const QTime& mytime)
{
if (m_mytime != mytime)
{
m_mytime = mytime
emit myTimeChanged(mytime);
}
}

signals:
void myTimeChanged(const QTime& mytime);

private:
QTime m_mytime;
TSomeClass* m_pSomeClass;
};







class TSomeClass : public QWidget
{
Q_OBJECT
public:
TSomeClass(TParentClass * pParent = 0, const char * cName = 0 )
: QObject(pParent, cName)
{

}
virtual ~TSomeClass()
{
}

protected:
   virtual void paintEvent (QPaintEvent *event)
{
QWidget::paintEvent(event);

if (this->parent() != NULL)
{
QTime myTime = qobject_cast<TParentClass*>(parent())->myTime();

}

}
};
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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