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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: qt analog of motif constraint resources  (Прочитано 10337 раз)
programmer
Гость
« : Сентябрь 27, 2006, 11:57 »

Привет!

Qt 4.1.4

Есть ли возможность Qt виджетам в рантайме назначать и модифицировать какой то ресурс изначально не определенный в классе наподобии того как это делается в Motif с constraint resources?

Хочется чтобы виджет имел набор свойств которыми может пользоваться родитель независимо от того кто родитель на самом деле.

Спасибо!
Записан
bigirbis
Гость
« Ответ #1 : Сентябрь 27, 2006, 14:20 »

Добавь в его состав пару контейнеров и аксессоров к ним - и будет тебе счастье.
Записан
programmer
Гость
« Ответ #2 : Сентябрь 27, 2006, 14:39 »

я не могу добавить ничего к целевым классам
целью моего вопроса было получить информацию есть ли какой то стандартный для qt механизм
Записан
bigirbis
Гость
« Ответ #3 : Сентябрь 27, 2006, 15:22 »

Прямого механизма нет. Но можно написать свой класс, пронаследованный от QObject:

Код:
class MyClass : public QObject
{
 public:
 MyClass( QObject * parent ) : QObject( parent )
 {
 ...
 }
 private:
 ...
}

Например:
Код:
MyClass * mc = new MyClass( someWidget );

И далее:
Код:
MyClass * mc = someWidget->findChild < MyClass * > ();
Записан
programmer
Гость
« Ответ #4 : Сентябрь 27, 2006, 15:29 »

жаль что нельзя сделать нативно без перестройки классов
спасибо за ответ - все таки придется создавать контейнеры на стороне родительского класса
Записан
bigirbis
Гость
« Ответ #5 : Сентябрь 27, 2006, 15:37 »

Можно создать всего один класс, который будет иметь всю необходимую функциональность. А потом создавать экземпляры и цеплять их к необходимым виджетам
Записан
programmer
Гость
« Ответ #6 : Сентябрь 27, 2006, 15:44 »

цеплять как wrapper насколько я понял?
Записан
Dendy
Гость
« Ответ #7 : Сентябрь 27, 2006, 15:47 »

В базовьІх классах Qt (QObject, QWidget) нет ничего лишнего, собственно ето и правильно. К ним всегда можно приклеить свой обьект со свойствами, которьІй будет автоматически удалён.

Например, вот способ прикрутить два параметра к совершенно любому уже созданному обьекту:

Код:

class MyProperties : public QObject
{
  Q_OBJECT
  Q_PROPERTY( int digit READ digit )
  Q_PROPERTY( QString errorString READ errorString )

public:
  MyProperties( QObject * parent );

  int digit() const;
  QString errorString() const;
};

...
QWidget * widget = get_widget_from_form();
QObject * properties = new MyProperties( widget );
properties->setObjectName( "my_properties" );
...


И теперь из любой точки программьІ, в которой не видно обьявление класса MyProperties можно писать:

Код:
QObject * properties = get_widget_from_form()->findChild<QObject*>( "my_properties" );
if ( properties )
{
  int digit = propertiers->property( "digit" ).toInt();
  QString error = properties->property( "errorString" ).toString();
}
Записан
bigirbis
Гость
« Ответ #8 : Сентябрь 27, 2006, 15:57 »

Зачем?
Код:
MyClass * mc = new MyClass( someWidget );

В этом случае создается твой объект с родителем someWidget. mc будет застрелен при разрушении someWidget как child. В любом месте программы ты сможешь обратиться к данному объекту, если доступен someWidget.
Код:
MyClass * mc = someWidget->findChild < MyClass * > ();

Вот собственно и все.

добавлено спустя 2 минуты:

 
Цитировать
Например, вот способ прикрутить два параметра к совершенно любому уже созданному обьекту:

Условия задачи, как я понимаю, несколько другие, требуется установить свойства для уже созданных классов без наследования.
Записан
Dendy
Гость
« Ответ #9 : Сентябрь 27, 2006, 16:00 »

Цитата: "bigirbis"
Условия задачи, как я понимаю, несколько другие, требуется установить свойства для уже созданных классов без наследования.


Так наследования и нет, произвольньІе свойства цепляются к уже созданному ранее обьекту, пересмотри ещё раз код.
Записан
bigirbis
Гость
« Ответ #10 : Сентябрь 27, 2006, 16:03 »

Пардон, осилил. Но это ничем не отличается от предложенного мной варианта.
Записан
Dendy
Гость
« Ответ #11 : Сентябрь 27, 2006, 16:15 »

Цитата: "bigirbis"
Пардон, осилил. Но это ничем не отличается от предложенного мной варианта.


Немного отличается. Тем, что не нужно знать тип обьекта с параметрами на етапе компилляции.  :wink:  Динамически устанавливать/получать параметрьІ через QVariant.

Собственно, вариант немного медленнее будет работать, но, мне кажется, ето один из тех случаев где ето не критично.
Записан
bigirbis
Гость
« Ответ #12 : Сентябрь 27, 2006, 16:34 »

Цитировать
Динамически устанавливать/получать параметры; через QVariant.

Судя по хелпу, набор параметров динамически не устанавливается.
Записан
Dendy
Гость
« Ответ #13 : Сентябрь 27, 2006, 16:45 »

Цитата: "bigirbis"
Цитировать
Динамически устанавливать/получать параметры; через QVariant.

Судя по хелпу, набор параметров динамически не устанавливается.


ТьІ имеешь в виду мой пост или документацию? ПараметрьІ могут устанавливаться/получаться динамически. Дополню ранне написанньІй код:

Код:

class MyProperties : public QObject
{
  Q_OBJECT
  Q_PROPERTY( int digit READ digit WRITE setDigit )
  Q_PROPERTY( QString errorString READ errorString WRITE setErrorString )

public:
  MyProperties( QObject * parent ) :
    QObject( parent ), digit_( 0 )
  {
  }

  int digit() const { return digit_; }
  void setDigit( int digit ) { digit_ = digit; }

  QString errorString() const { return error_string_; }
  void setErrorString( const QString & error ) { error_string_ = error; }

private:
  int digit_;
  QString error_string_;
};

...

QObject * properties = get_widget_from_form()->findChild<QObject*>( "my_properties" );
if ( properties )
{
  int digit = properties->property( "digit" ).toInt();
  QString error = properties->property( "errorString" ).toString();

  properties->setProperty( "digit", 123 );
  properties->setProperty( "errorString", "kernel panic" );
}
Записан
bigirbis
Гость
« Ответ #14 : Сентябрь 27, 2006, 18:36 »

Цитировать
ПараметрьІ могут устанавливаться/получаться динамически.

Имелось в виду то, что нельзя в рантайме добавлять новые виды свойств, кроме как через контейнеры.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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