Немного грязного кода, позиционирования и прочего...для новеньких.

Итак, сегодня я покажу как создать свой тип контейнера(?) в QML и как связать сигналы в C++ со слотами в QML ну и да код грязненький но не страшно. Итак задача: Расчитать точное астрономическое время и на его основе сделать часики.
Получится такой приложук:
Немного грязного кода, позиционирования и прочего...для новеньких.


Точное астрономическое время это когда в 12:00 солнышко находится в зените и на севере.
То есть, задача 1 - найти координаты, задача 2 - отобразить смещение относительно Гринвича.
Ради обучения будем искать координаты в C++ части, а отображать в QML, хотя можно всё сделать в QML, но это не сегодня. Итак погнали.
Прежде всего, так как нам нужно позиционирование то добавим в pro файл нашего проекта строчку:
Код PHP:
  1. QT += positioning
Далее создаём класс , назовём его geoPositing чё мудорствовать лукаво...
Код CPP-QT:
  1. #include "geopositing.h"
  2.  
  3. #include <QGeoPositionInfoSource>
  4. #include <QDebug>
  5.  
  6. geoPositing::geoPositing(QObject *parent) :
  7. QObject(parent)
  8. {
  9. //Инициализируем поиск по всем источникам
  10. QGeoPositionInfoSource *source = QGeoPositionInfoSource::createDefaultSource(0);
  11. //Время обновления - 1 секунда
  12. source->setUpdateInterval(1000);
  13. //Если позиция изменилась то вызываем функцию - если вы знакомы с сигналами и слотам в Qt то тут всё понятно.
  14. connect(source, SIGNAL(positionUpdated(QGeoPositionInfo)), this, SLOT(positionUpdated(QGeoPositionInfo)));
  15. //Ну и запускаем всё это дело.
  16. source->startUpdates();
  17. }
  18.  
  19. void geoPositing::positionUpdated(const QGeoPositionInfo &info)
  20. {
  21. //Получаем координаты
  22. QGeoCoordinate coord=info.coordinate();
  23. double lng, lat;
  24. //И записываем из в переменные. Не обязательно, но для наглядности
  25. lng = coord.longitude();
  26. lat = coord.latitude();
  27. //Если инфа валидная то рассчитываем смещение относительно Гринвича
  28. if(info.isValid())
  29. {
  30. // 4 минуты на градус смещения 60 секунд в минуте тут всё понятно
  31. double offset = lng*4*60;
  32. // Шлём сигнал мол обновляй смещение.
  33. emit offsetChange(offset);
  34. //Срём в консоль
  35. qDebug() << "OFFSET:" << offset << " LNG:" << lat;
  36. }
  37. else
  38. {
  39. //Опять срём в консоль
  40. qDebug() << "Position error";
  41. }
  42. }
  43.  
Тут думаю всё понятно и просто C++ код как у всех. Теперь начнём магию - не просто связываем, а делаем наш объект в QML
Магия начинается в main.cpp
Код CPP-QT:
  1. #include <QGuiApplication>
  2. #include <QQmlApplicationEngine>
  3. #include <QDateTime>
  4. // Для регистрации своего объекта нам это нужно
  5. #include <QQmlContext>
  6. #include <QQuickItem>
  7.  
  8. #include "src/geopositing.h"
  9.  
  10. int main(int argc, char *argv[])
  11. {
  12. QGuiApplication app(argc, argv);
  13.  
  14. //Вот тут вся магия ! Объяснение чуть ниже.
  15. qmlRegisterType<geoPositing>("geoPositing",1,0,"GeoPositing");
  16.  
  17. engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
  18.  
  19. return app.exec();
  20. }
  21.  
Итак, самый смак в функции qmlRegisterType которая регистрирует класс в QML работает она так: qmlRegisterType<ИМЯ_КЛАССА>("НАЗВАНИЕ МОДУЛЯ",minor,major,"ИМЯ ОБЪЕКТА"). minor и major это версия. Я не парюсь и ставлю 1,0 чтобы было. Далее вся магия растекается в QML часть. Тут у нас она одна:

Код QML:
  1. import QtQuick 2.4
  2. import QtQuick.Window 2.2
  3.  
  4. import QtGraphicalEffects 1.0
  5. //Вот импорт нашего объекта с версией
  6. import geoPositing 1.0
  7.  
  8. id: main
  9. visible: true
  10. color: "black"
  11.  
  12. property int offset: 0;
  13. //А вот и сам наш объект - вызвали класс как говорится.
  14. GeoPositing{
  15. id: geoPositon
  16. }
  17.  
  18. Text {
  19. id: timeText;
  20. anchors.centerIn: parent
  21. color: "white"
  22. font.pixelSize: height/2
  23. font.bold: true
  24. z: 2
  25. width: parent.width-20
  26. height: parent.height/4
  27. fontSizeMode: Text.Fit
  28. horizontalAlignment: Text.AlignHCenter
  29. }
  30. //Это красота можно не обращать внимание.
  31. anchors.fill: parent
  32. start: Qt.point(0, 0)
  33. end: Qt.point(0, parent.height)
  34. gradient: Gradient {
  35. GradientStop { position: 0.0; color: "#FF5E3A" }
  36. GradientStop { position: 1.0; color: "#FF9104" }
  37. }
  38. z: 1
  39. }
  40.  
  41. id: timer
  42. interval: 1000
  43. repeat: true
  44. running: true
  45.  
  46. onTriggered:
  47. {
  48. if(main.offset != 0)
  49. {
  50. var date = Math.floor(Date.now()/1000);
  51. date = date+offset;
  52.  
  53. timeText.text = Qt.formatTime(new Date(date*1000).toISOString(),"hh:mm:ss")
  54. }
  55. else
  56. {
  57. timeText.text = "Где я?"
  58. }
  59. }
  60. }
  61. //А вот тут мы соединяем наш сигнал в объекте с QML
  62. // цель - id нашего объекта
  63. target: geoPositon;
  64. // сигнал - пишется так onИмяСигнала именно с большой буквы
  65. onOffsetChange: {
  66. // тут действия при сигнале
  67. main.offset = offset
  68. }
  69. }
  70. }
  71.  
Вот в принципе и всё - создали объект на C++ плюнули его сигналом в QML и обработали его.
Код на github
В гугл плей
Понравилось? Можешь закинуть мне денег на бепеху сюда 89662491221 (Билайн)
Комментарии (0)

Нет комментариев. Ваш будет первым!

Copyright 2016-2024 NeoChapay