Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Владислав от Май 23, 2013, 14:20



Название: Ошибка в QT? Ошибка сеттеров для QWidgetStar QObjectStar
Отправлено: Владислав от Май 23, 2013, 14:20
Здравствуйте!

В сеттеры QMetaType::QWidgetStar и QMetaType::QObjectStar передаются неверные указатели!

Проверял так:
class CGui : public QObject
{
   Q_OBJECT
   Q_PROPERTY(QWidget* from1 READ from1 WRITE setfrom1)
private:
   QWidget * from1wi;
   QWidget*  from1()
   {
      return from1wi;
   };
   void setfrom1(QWidget* _v)
   {
      
      from1wi = _v;//
   };

...
}

И, если сделать
   from1wi = new QWidget;
   setProperty( "from1", QVariant( QMetaType::QObjectStar, from1wi ) );
, то в аргумент метода setfrom1 придёт неверный указатель!!!

Проверял на qt 4.6.4



Название: Re: Ошибка в QT? Ошибка сеттеров для QWidgetStar QObjectStar
Отправлено: Bepec от Май 23, 2013, 14:25
Вы в QWidget* пытаетесь запихать QObject* тип. Или я неправ?


Название: Re: Ошибка в QT? Ошибка сеттеров для QWidgetStar QObjectStar
Отправлено: Владислав от Май 23, 2013, 23:46
это здесь опечатка, я для QWidget* проверял как

class CGui : public QObject
{
   Q_OBJECT
   Q_PROPERTY(QWidget* from1 READ from1 WRITE setfrom1)
public:
   QWidget * from1wi;
private:   
   QWidget*  from1()
   {
      return from1wi;
   };
   void setfrom1(QWidget* _v)
   {
     
      from1wi = _v;//
   };

};

Посылаем
CGui cgi;
  cgi.from1wi = new QWidget;
   cgi.setProperty( "from1", QVariant( QMetaType::QWidgetStar, cgi.from1wi ) );

Ещё раз проверил, не поленился - в setfrom1 неверный указатель идёт!!!



Название: Re: Ошибка в QT? Ошибка сеттеров для QWidgetStar QObjectStar
Отправлено: Bepec от Май 24, 2013, 07:11
В душе не чаю что там происходит :) Просто записывайте и считывайте long.


Название: Re: Ошибка в QT? Ошибка сеттеров для QWidgetStar QObjectStar
Отправлено: Serr500 от Май 24, 2013, 08:53
Цитировать
QVariant::QVariant ( int typeOrUserType, const void * copy )

Constructs variant of type typeOrUserType, and initializes with copy if copy is not 0.

Note that you have to pass the address of the variable you want stored.

Usually, you never have to use this constructor, use QVariant::fromValue() instead to construct variants from the pointer types represented by QMetaType::VoidStar, QMetaType::QObjectStar and QMetaType::QWidgetStar.

See also QVariant::fromValue() and Type.


Название: Re: Ошибка в QT? Ошибка сеттеров для QWidgetStar QObjectStar
Отправлено: Владислав от Май 24, 2013, 09:55
Благодарю вас за ответы, а Serr500 отдельное спасибо!

CGui cgi;
cgi.from1wi = new QWidget;
//cgi.setProperty( "from1", QVariant( QMetaType::QWidgetStar, cgi.from1wi ) );
cgi.setProperty( "from1", QVariant::fromValue( cgi.from1wi ) );