Russian Qt Forum

Qt => Вопросы новичков => Тема начата: demaker от Январь 05, 2017, 22:32



Название: использование Q_PROPERTY
Отправлено: demaker от Январь 05, 2017, 22:32
Скажите как определить правильно свойство в объекте, чтобы я потом мог его вытащить в QML???

Код
C++ (Qt)
class ExchangeColor : public QObject
{
   Q_OBJECT
   Q_PROPERTY(QString current READ current)
 
//private:
//    QString current;
 
public:
   explicit ExchangeColor(QObject *parent = 0);
   virtual ~ExchangeColor();
 
   QString current() const {return current;}
   Q_INVOKABLE QString nextColor();
 
private:
   QTimer *timer;
 
signals:
   void changeColor();
 
public slots:
};
 

Код
C++ (Qt)
Item {  
   width: 360
   height: 360
 
   ExchangeColor{
       id: exchColor
       current: redrect.color //не находит свойство ???
       onChangeColor: {redrect.color = bluerect.color = nextColor()}
   }
 
 


Название: Re: использование Q_PROPERTY
Отправлено: titan83 от Январь 06, 2017, 10:01
У тебя тут несколько проблем:
1. Ты привел не весь код, но, скорее всего, у тебя нет qmlRegisterType<ExchangeColor>("MySuperLib", 1, 0, "ExchangeColor");
2. Свойство свое ты сделал read-only, но при этом пытаешься сделать биндинг к другому свойству, а записать-то тебе его у себя нечем.
3. Сигнал у тебя просто так болтается, ты бы сделал в описании свойста NOTIFY changeColor. Совет: сигналы лучше именовать в стиле существительноеГлагол-в-прошедшем-времени, т.е. colorChanged будет намного логичнее, да и onColorChanged тоже намного правильнее по смыслу.
4. Используй слово MEMBER в описании свойства, тогда не нужно будет сеттеров-геттеров.
5. Ну и доки-то читай, ага))


Название: Re: использование Q_PROPERTY
Отправлено: demaker от Январь 06, 2017, 16:48
я наверное  :) не правильно выразился

qmlRegisterType есть
Код
C++ (Qt)
int main(int argc, char *argv[])
{
   QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
   QGuiApplication app(argc, argv);
 
   qmlRegisterType<ExchangeColor>("com.mycompany.qmlcomponents",1,0,"ExchangeColor");
 
   QQmlApplicationEngine engine;
   engine.load(QUrl(QLatin1String("qrc:/main.qml")));
 
   return app.exec();
}
 

Я имел ввиду , что не могу создать свойство через Q_PROPERTY.

Пытаюсь сделать так
Код
C++ (Qt)
...
   Q_PROPERTY(QString current READ current)
 
public:
   explicit ExchangeColor(QObject *parent = 0);
   virtual ~ExchangeColor();
   QString current() const {return current;}
...
 
Не получается
Ошибка:
Код:
In file included from ..\MyQMLProj\main.cpp:5:0:
..\MyQMLProj\exchangecolor.h: In member function 'QString ExchangeColor::current() const':
..\MyQMLProj\exchangecolor.h:21:37: error: cannot convert 'ExchangeColor::current' from type 'QString (ExchangeColor::)() const' to type 'QString'
     QString current() const {return current;}

Только если так делать
Код
C++ (Qt)
...
   Q_PROPERTY(QString current READ getCurrent)
private:
   QString current;
 
public:
   explicit ExchangeColor(QObject *parent = 0);
   virtual ~ExchangeColor();
   QString geCurrent() const { return current; }    
...
 
но тогда он все равно не видет проперти current в QML
Код:
 ...
 ExchangeColor{
        id: exchColor
        current: redrect.color ->???      
    }


Название: Re: использование Q_PROPERTY
Отправлено: qate от Январь 06, 2017, 17:04
внимательно прочитай пример  http://doc.qt.io/qt-5/properties.html#a-simple-example
особое внимание обрати на имена методов и полей класса


Название: Re: использование Q_PROPERTY
Отправлено: demaker от Январь 06, 2017, 17:57
внимательно прочитай пример  http://doc.qt.io/qt-5/properties.html#a-simple-example
особое внимание обрати на имена методов и полей класса

Спасибо