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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Данные из сингнала  (Прочитано 5443 раз)
nekitozzz
Гость
« : Июль 03, 2012, 13:59 »

Есть сигнал, который оповещает об изменении значения координаты X. Qml файл при каждом таком изменении в обработчике onFirst_ball_xChanged должен изменить значение координаты элемента с id: ball (этот элемент на самом деле Rectangle), однако я получаю ошибку Получаю ошибку: ReferenceError: Can't find variable: first_ball_X_value, не могу понять, зачем Qml не видит эту переменную, также сам обработчик onFirst_ball_xChanged при подстановке туда видимых элементов вызывается только один раз, буду рад, если кто-нибудь объяснит, или подтолкнёт меня к правильному пути.

Ниже привожу куски кода из файлов ball.h, ball.cpp, main,qml

Код
C++ (Qt)
#include <QDeclarativeItem>
 
class ball : public QDeclarativeItem
{
   Q_OBJECT
 
   int first_ball_X;
 
   Q_PROPERTY(int first_ball_x READ get_first_ball_x WRITE set_first_ball_x
              NOTIFY first_ball_xChanged)
public:
   explicit ball(QDeclarativeItem *parent = 0);
   const int& get_first_ball_x() const;
 
   void set_first_ball_x(const int);
 
protected:
   void timerEvent(QTimerEvent *);
 
signals:
   void first_ball_xChanged(int first_ball_X_value);
};

Код
C++ (Qt)
void ball::timerEvent(QTimerEvent *te)
{
   static int ready = 1;
   if (ready >= 100)
   {
       killTimer(te->timerId());
       qDebug() << "Stop ball rolling";
       emit readyDone();
   }
   else
   {
       ready++;
       first_ball_X = first_ball_X - (2 * shift_X / ready);
       int first_ball_X_value = first_ball_X;
       emit first_ball_xChanged(first_ball_X_value);
   }
}
 

Код
Javascript
Ball
       {
           anchors.fill: parent
           id: ball_main
           MouseArea
           {
               anchors.fill: parent
               onClicked:
               {
                   ball_main.shift_x = mouseX - ball_1.x - ball_1.width/2  // center of ball on Ox
                   ball_main.shift_y = mouseY - ball_1.y - ball_1.height/2 // center of ball on Oy
                   onFirst_ball_xChanged: ball_1.x = first_ball_X_value;
 
               }
 
           }
       }
« Последнее редактирование: Июль 03, 2012, 22:11 от nekitozzz » Записан
mutineer
Гость
« Ответ #1 : Июль 03, 2012, 14:04 »

1) Какой сакральный смысл у этого кода?
Код:
int first_ball_X_value = first_ball_X;
emit first_ball_xChanged(first_ball_X_value);

2) Тебя не беспокоит факт объявления одного слота в другом?
Вынеси onFirst_ball_xChanged в тело Ball из обработчика клика
Записан
OKTA
Гость
« Ответ #2 : Июль 03, 2012, 14:10 »

а какие сношения имеет ball из qml и ball из с++??
Записан
nekitozzz
Гость
« Ответ #3 : Июль 03, 2012, 14:45 »

а какие сношения имеет ball из qml и ball из с++??

ну в main есть строчка:
   
Код
C++ (Qt)
qmlRegisterType<ball>("balls", 1, 0, "Ball");

1) Какой сакральный смысл у этого кода?
Код:
int first_ball_X_value = first_ball_X;
emit first_ball_xChanged(first_ball_X_value);

никакого Улыбающийся исправил на
Код
C++ (Qt)
emit first_ball_xChanged(first_ball_X);

2) Тебя не беспокоит факт объявления одного слота в другом?
Вынеси onFirst_ball_xChanged в тело Ball из обработчика клика

спасибо большое, ужасно глупо, вынес onFirst_ball_xChanged прямо под onClick:

Код
Javascript
onFirst_ball_xChanged:
{
     ball_1.x = first_ball_X_value;
}
однако получаю qrc:data/qml/untitled/main.qml:53:17: Cannot assign to non-existent property "onFirst_ball_xChanged" . И в IDE подчёркивается
Цитировать
"onFirst_ball_xChanged" не является корректным свойством
.

Я читал, что Qt сигналы доступны из Qml просто добавлением on к имени сигнала, может что-то ещё надо добавлять?
Записан
Patrin Andrey
Гость
« Ответ #4 : Июль 03, 2012, 15:02 »

Почему бы просто вот так не написать?
Код:
Ball
        {
            anchors.fill: parent
            id: ball_main
            ball_1.x: first_ball_X_value;
            MouseArea
            {
                anchors.fill: parent
                onClicked:
                {
                    ball_main.shift_x = mouseX - ball_1.x - ball_1.width/2  // center of ball on Ox
                    ball_main.shift_y = mouseY - ball_1.y - ball_1.height/2 // center of ball on Oy
 
                }
 
            }
        }
Записан
mutineer
Гость
« Ответ #5 : Июль 03, 2012, 15:13 »

2) Тебя не беспокоит факт объявления одного слота в другом?
Вынеси onFirst_ball_xChanged в тело Ball из обработчика клика

спасибо большое, ужасно глупо, вынес onFirst_ball_xChanged прямо под onClick:

Код
Javascript
onFirst_ball_xChanged:
{
     ball_1.x = first_ball_X_value;
}
однако получаю qrc:data/qml/untitled/main.qml:53:17: Cannot assign to non-existent property "onFirst_ball_xChanged" . И в IDE подчёркивается
Цитировать
"onFirst_ball_xChanged" не является корректным свойством
.

Я читал, что Qt сигналы доступны из Qml просто добавлением on к имени сигнала, может что-то ещё надо добавлять?

first_ball_xChanged это сигнал Ball, а не MouseArea. Ты же, как я понял, вынес свой метод в MouseArea, в котором такого сигнала естественно нет. Выноси в тело Ball, вне MouseArea
Записан
mutineer
Гость
« Ответ #6 : Июль 03, 2012, 15:15 »

Почему бы просто вот так не написать?
Код:
Ball
        {
            anchors.fill: parent
            id: ball_main
            ball_1.x: first_ball_X_value;
            MouseArea
            {
                anchors.fill: parent
                onClicked:
                {
                    ball_main.shift_x = mouseX - ball_1.x - ball_1.width/2  // center of ball on Ox
                    ball_main.shift_y = mouseY - ball_1.y - ball_1.height/2 // center of ball on Oy
 
                }
 
            }
        }

Потому что у класса Ball нет поля first_ball_X_value, есть только first_ball_x
Записан
nekitozzz
Гость
« Ответ #7 : Июль 03, 2012, 15:18 »

first_ball_xChanged это сигнал Ball, а не MouseArea. Ты же, как я понял, вынес свой метод в MouseArea, в котором такого сигнала естественно нет. Выноси в тело Ball, вне MouseArea

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


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