Аватар для Recrut_rf
374 / 317 / 65
Регистрация: 14.10.2014
Сообщений: 1,354

GPS и С++ Qt

13.11.2020, 21:18. Показов 3657. Ответов 5

Author24 — интернет-сервис помощи студентам
Здравствуйте знатоки, сообщите пожалуйста, как написать прогу при помощи Qt Creator и С++, чтобы на телефоне с ОС android 4.3 (да, у меня такой старый телефон ) вывести данные о долготе и широте при помощи имеющегося в телефоне GPS?

Вот моя попытка:
MainWidget.cpp:
Кликните здесь для просмотра всего текста

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "MainWidget.h"
#include "ui_MainWidget.h"
 
MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MainWidget)
{
    ui->setupUi(this);
 
    QGeoPositionInfoSource *source = QGeoPositionInfoSource::createDefaultSource(this);
 
    if (source) {
        connect(source, SIGNAL(positionUpdated(QGeoPositionInfo)),
                this, SLOT(positionUpdated(QGeoPositionInfo)));
        source->startUpdates();
    }
 
}
 
MainWidget::~MainWidget()
{
    delete ui;    
}
 
 
void MainWidget::on_pushButton_clicked()
{
    QString str = QString::number(alt, 'f', 6) + "\n" + QString::number(lat, 'f', 6);
    ui->label->setText(str);
}
 
void MainWidget::on_pushButton_2_clicked()
{
    ui->label->clear();
}
 
void MainWidget::on_pushButton_3_clicked()
{
    this->close();
}
 
void MainWidget::positionUpdated(const QGeoPositionInfo &info)
{
    ui->label->setText(info.coordinate().toString());
    qGeoCoordinate = info.coordinate();
    alt = qGeoCoordinate.altitude();
    lat = qGeoCoordinate.latitude();
}


MainWidget.h:
Кликните здесь для просмотра всего текста

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <QWidget>
#include <QtPositioning/QGeoCoordinate>
#include <QGeoPositionInfoSource>
#include <QtPositioning>
 
QT_BEGIN_NAMESPACE
namespace Ui { class MainWidget; }
QT_END_NAMESPACE
 
class MainWidget : public QWidget
{
    Q_OBJECT
 
public:
    MainWidget(QWidget *parent = nullptr);
    ~MainWidget();
 
private slots:
    void on_pushButton_clicked();
 
    void on_pushButton_2_clicked();
 
    void on_pushButton_3_clicked();
 
    void positionUpdated(const QGeoPositionInfo &info);
 
private:
    Ui::MainWidget *ui;
 
    QGeoCoordinate qGeoCoordinate;
    QGeoPositionInfoSource *source;
    QGeoPositionInfo lastPosition;
 
    double alt = 0.;
    double lat = 0.;
};
#endif // MAINWIDGET_H


Во вложении весь проект, он на моём телефоне запускается, только данные выводит нулевые. На эмуляторе показывает данные. Как добиться того, чтоб и на телефоне выводил данные? Может нужно какие настройки включать в телефоне? В файле андроид-манифест я добавлял доступ к геоданным (вроде как).
Вложения
Тип файла: zip AndroidProjects.zip (2.9 Кб, 15 просмотров)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.11.2020, 21:18
Ответы с готовыми решениями:

Убрать диалог о включении GPS и иконку GPS. Тихий запуск GPS
Здравствуйте! Подскажите есть ли возможность включить GPS в тихом режиме, чтобы пользователь не догадался об этом! На данном...

В чем разница между БП Chieftec GPS-400AA-101 A и GPS-400A ?
В марте закончилась гарантия. И вот сдох блок питания (1). Мне впарили второй (2). Говорят нет разницы, но если я не ошибаюсь, разница от 5...

GPS навигатор на планшет windows 8.1 с модулем GPS (DIGMA EVE 8.0)
Здравствуйте. Всех с наступившим годом и рождеством! Прошу помощи, есть планшет с GPS (DIGMA EVE 8.0) - 2015 года выпуска, ищу...

5
Эксперт .NET
 Аватар для insite2012
5546 / 4309 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
13.11.2020, 21:39
Лучший ответ Сообщение было отмечено Recrut_rf как решение

Решение

Цитата Сообщение от Recrut_rf Посмотреть сообщение
В файле андроид-манифест я добавлял доступ к геоданным (вроде как).
Насколько я помню, это не работает так как ожидается. Вам нужно явно запросить нужные разрешения при запуске программы на телефоне. Ниже мой код одного из проектов для Андроида, там как раз в функции main() есть строки, относящиеся к запросу разрешений. Попробуйте взять оттуда то что нужно и использовать в вашем проекте, в функции main().
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <QQmlContext>
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QTranslator>
 
#include "SQLiteManager.h"
#include "FileHandler.h"
#include "SettingsHandler.h"
#include "BluetoothScanner.h"
#include "EepReaderHandler.h"
#include "EepWriterHandler.h"
 
#ifdef Q_OS_ANDROID
#include <QtAndroid>
 
//"android.permission.WRITE_SETTINGS"
//"android.permission.ACCESS_FINE_LOCATION"
//"android.permission.ACCESS_BACKGROUND_LOCATION"
 
const QVector<QString> permissions({"android.permission.BLUETOOTH",
                                    "android.permission.BLUETOOTH_ADMIN",
                                    "android.permission.WRITE_EXTERNAL_STORAGE",
                                    "android.permission.READ_EXTERNAL_STORAGE",
                                    "android.permission.ACCESS_COARSE_LOCATION"});
#endif
 
 
int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);
    QGuiApplication::setApplicationName("Service Tool Mobile");
    QGuiApplication::setApplicationVersion("1.2.0.0");
    QGuiApplication::setOrganizationName("Home Appliances Tools");
 
    qmlRegisterType<SettingsHandler>("com.ServiceToolMobile",1,0,"SettingsHandler");
    qmlRegisterType<BluetoothScanner>("com.ServiceToolMobile", 1, 0, "BluetoothScanner");
    qmlRegisterType<SQLiteManager>("com.ServiceToolMobile", 1, 0, "SQLiteManager");
 
 
 
#if defined (Q_OS_ANDROID)
    //Request requiered permissions at runtime
    for(const QString &permission : permissions){
        auto result = QtAndroid::checkPermission(permission);
        if(result == QtAndroid::PermissionResult::Denied){
            auto resultHash = QtAndroid::requestPermissionsSync(QStringList({permission}));
            if(resultHash[permission] == QtAndroid::PermissionResult::Denied)
                return 0;
        }
    }
#endif
 
    FileHandler* pFileHandler=new FileHandler;
    EepReaderHandler eepReaderHandler(pFileHandler);
    EepWriterHandler eepWriterHandler(pFileHandler);
 
    QQmlApplicationEngine engine;
    QQmlContext* ctx=engine.rootContext();
 
    ctx->setContextProperty("fileHandler", pFileHandler);
    ctx->setContextProperty("eepReaderHandler", &eepReaderHandler);
    ctx->setContextProperty("eepWriterHandler", &eepWriterHandler);
 
 
    engine.load(QUrl(QLatin1String("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty()){
        return -1;
    }
 
    QTranslator translator;
    bool result = translator.load(":/lang/ServiceToolMobile_ru.qm");
    qDebug()<<result;
    qApp->installTranslator(&translator);
 
    engine.retranslate();
 
    return app.exec();
}
1
 Аватар для Recrut_rf
374 / 317 / 65
Регистрация: 14.10.2014
Сообщений: 1,354
13.11.2020, 22:12  [ТС]
insite2012, Спасибо буду изучать ваш пример, завтра отпишусь о результатах.
0
 Аватар для Recrut_rf
374 / 317 / 65
Регистрация: 14.10.2014
Сообщений: 1,354
15.11.2020, 20:54  [ТС]
Я слегка модернизировал проект, но результат тот же. Почему то выводит нули вместо данных.

Тестировал в Qt Creator 4.5.0 в cвязке с Qt 5.10.0 и в Qt Creator 4.13.2 в связке с Qt 5.12.2.
В обоих случаях проект на телефоне запускается, но данные выводит - 0.0000.
Если что - Версия андроида - 4.3, на телефоне были включены и интернет и GPS.

Почему то не отрабатывает слот:
C++ (Qt)
1
void positionUpdated(const QGeoPositionInfo &info);
хотя этот код нормально отрабатывает:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
if (source)
    {
        connect(source, SIGNAL(positionUpdated(QGeoPositionInfo)),this, SLOT(positionUpdated(QGeoPositionInfo)));
 
        // сюда заходит но почему-то не отрабатывает слот positionUpdated(QGeoPositionInfo)
        source->startUpdates();
        qDebug()<<"Source found";
        qDebug()<<source->availableSources();
    }else{
        qDebug()<<"Failed source";
    }
Может кто - нибудь подскажет, где я накосячил?


Весь проект во вложении.

Отдельные части:
MainWidget.cpp
Кликните здесь для просмотра всего текста

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include "MainWidget.h"
#include "ui_MainWidget.h"
 
MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MainWidget)
{
    ui->setupUi(this);
 
    source = QGeoPositionInfoSource::createDefaultSource(this);
 
    if (source)
    {
        connect(source, SIGNAL(positionUpdated(QGeoPositionInfo)),this, SLOT(positionUpdated(QGeoPositionInfo)));
 
        // сюда заходит но почему-то не отрабатывает слот positionUpdated(QGeoPositionInfo)
        source->startUpdates();
        qDebug()<<"Source found";
        qDebug()<<source->availableSources();
    }else{
        qDebug()<<"Failed source";
    }
}
 
MainWidget::~MainWidget()
{
    delete ui;    
}
 
 
void MainWidget::on_pushButton_clicked()
{
    QString str = QString::number(alt, 'f', 6) + "\n" + QString::number(lat, 'f', 6);
    ui->label->setText(str);
}
 
void MainWidget::on_pushButton_2_clicked()
{
    ui->label->clear();
}
 
void MainWidget::on_pushButton_3_clicked()
{
    this->close();
}
 
void MainWidget::positionUpdated(const QGeoPositionInfo &info)
{
    alt = info.coordinate().altitude();
    lat = info.coordinate().latitude();
}


MainWidget.h

Кликните здесь для просмотра всего текста

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
 
#include <QWidget>
#include <QtPositioning/QGeoCoordinate>
#include <QGeoPositionInfoSource>
#include <QtPositioning>
 
 
QT_BEGIN_NAMESPACE
namespace Ui { class MainWidget; }
QT_END_NAMESPACE
 
class MainWidget : public QWidget
{
    Q_OBJECT
 
public:
    MainWidget(QWidget *parent = nullptr);
    ~MainWidget();
 
private slots:
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();
    void on_pushButton_3_clicked();
 
    void positionUpdated(const QGeoPositionInfo &info);    
 
private:
    Ui::MainWidget *ui;    
 
    QGeoPositionInfoSource *source;
 
 
    double alt = 0.;
    double lat = 0.;
};
#endif // MAINWIDGET_H


main.cpp

Кликните здесь для просмотра всего текста

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include "MainWidget.h"
#include <QApplication>
 
// это если использовать версию Qt 5.12
//#include <QtAndroidExtras/QtAndroid>
 
// это если Qt 5.10
#include <QtAndroid>
 
const QVector<QString> permissions({"android.permission.ACCESS_COARSE_LOCATION",
                                    "android.permission.ACCESS_FINE_LOCATION",
                                    "android.permission.ACCESS_MOCK_LOCATION"});
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    MainWidget w;
 
    // пробовал этот вариант:
//    //Request requiered permissions at runtime
//    for(const QString &permission : permissions){
//        auto result = QtAndroid::checkPermission(permission);
//        if(result == QtAndroid::PermissionResult::Denied){
//            auto resultHash = QtAndroid::requestPermissionsSync(QStringList({permission}));
//            if(resultHash[permission] == QtAndroid::PermissionResult::Denied)
//                return 0;
//        }
//    }
 
    // и более развёрнутый вариант - результат одинаковый
    auto  result = QtAndroid::checkPermission(QString("android.permission.ACCESS_COARSE_LOCATION"));
    auto  result2 = QtAndroid::checkPermission(QString("android.permission.ACCESS_FINE_LOCATION"));
    auto  result3 = QtAndroid::checkPermission(QString("android.permission.ACCESS_MOCK_LOCATION"));
    if(result == QtAndroid::PermissionResult::Denied &&
            result2 == QtAndroid::PermissionResult::Denied &&
            result3 == QtAndroid::PermissionResult::Denied)
    {
        QtAndroid::PermissionResultMap resultHash = QtAndroid::requestPermissionsSync(QStringList({"android.permission.ACCESS_COARSE_LOCATION"}));
        QtAndroid::PermissionResultMap resultHash2 = QtAndroid::requestPermissionsSync(QStringList({"android.permission.ACCESS_FINE_LOCATION"}));
        QtAndroid::PermissionResultMap resultHash3 = QtAndroid::requestPermissionsSync(QStringList({"android.permission.ACCESS_MOCK_LOCATION"}));
        if(resultHash["android.permission.ACCESS_COARSE_LOCATION"] == QtAndroid::PermissionResult::Denied &&
                resultHash2["android.permission.ACCESS_FINE_LOCATION"] == QtAndroid::PermissionResult::Denied &&
                resultHash3["android.permission.ACCESS_MOCK_LOCATION"] == QtAndroid::PermissionResult::Denied)
        {
            // do whatever need if denied
            return 0;
        }
         else
        {
            // do whatever need if granted
            MainWidget w;
            w.show();
        }
    }
    else
    {
        w.show();
    }
    return a.exec();
}


AndroidProjects.pro

Кликните здесь для просмотра всего текста

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
QT       += core gui
 
QT       += widgets androidextras network positioning location
 
greaterThan(QT_MAJOR_VERSION, 4):
 
CONFIG += c++11
 
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
 
SOURCES += \
    main.cpp \
    MainWidget.cpp
 
HEADERS += \
    MainWidget.h
 
FORMS += \
    MainWidget.ui
 
TRANSLATIONS += \
    AndroidProjects_ru_RU.ts
 
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
 
DISTFILES += \
    android/AndroidManifest.xml \
    android/build.gradle \
    android/gradle/wrapper/gradle-wrapper.jar \
    android/gradle/wrapper/gradle-wrapper.properties \
    android/gradlew \
    android/gradlew.bat \
    android/res/values/libs.xml \
    android/AndroidManifest.xml \
    android/gradle/wrapper/gradle-wrapper.jar \
    android/gradlew \
    android/res/values/libs.xml \
    android/build.gradle \
    android/gradle/wrapper/gradle-wrapper.properties \
    android/gradlew.bat \
    android/AndroidManifest.xml \
    android/gradle/wrapper/gradle-wrapper.jar \
    android/gradlew \
    android/res/values/libs.xml \
    android/build.gradle \
    android/gradle/wrapper/gradle-wrapper.properties \
    android/gradlew.bat \
    android/AndroidManifest.xml \
    android/gradle/wrapper/gradle-wrapper.jar \
    android/gradlew \
    android/res/values/libs.xml \
    android/build.gradle \
    android/gradle/wrapper/gradle-wrapper.properties \
    android/gradlew.bat
 
contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
    ANDROID_PACKAGE_SOURCE_DIR = \
        $$PWD/android
}
 
LIBS += -landroid
 
contains(ANDROID_TARGET_ARCH,x86) {
    ANDROID_PACKAGE_SOURCE_DIR = \
        $$PWD/android
}
 
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
Вложения
Тип файла: zip AndroidProjects.zip (13.0 Кб, 13 просмотров)
0
 Аватар для Recrut_rf
374 / 317 / 65
Регистрация: 14.10.2014
Сообщений: 1,354
19.11.2020, 21:24  [ТС]
insite2012, Спасибо, за помощь, ваш пример очень помог - мой код, состряпаный по вашему примеру - исправный - это у меня телефон глючит временами и не находит нормально спутники. Мой говнокод работает.
0
Эксперт .NET
 Аватар для insite2012
5546 / 4309 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
19.11.2020, 22:20
Цитата Сообщение от Recrut_rf Посмотреть сообщение
Спасибо, за помощь
Ну и на здоровье, рад что смог помочь))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.11.2020, 22:20
Помогаю со студенческими работами здесь

Подключение GPS модуля Grove-GPS к Arduino UNO
Подсоединил Grove-GPS к Arduino UNO. Вот код программы: #include &lt;SoftwareSerial.h&gt; #include &lt;TinyGPS.h&gt; /* This sample code...

Отличия GPS-350FB-101A и GPS-350A
хочу купить бп Chieftec остановился на 2 моделях GPS-350FB-101A и GPS-350A по характеристикам вродь одинаковы но цена отличается на 4$...

GPS
Может я что то не понимаю, но все же. Есть в телефоне GPS раз информация о местоположении поступает со спутника, то возможно ли настроить...

GPS
Здравсвуйте. Есть LG P350. Установил на него 2 проги - Статус GPS и MapDroyd. Проблема в том, программы не могут получить координаты с...

GPS
Здравствуйте подскажите пожалуйста, есть ли функции определения координат (т.е. широту и долоту) в j2me


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

Новые блоги и статьи
Мульти-тенантные БД с PostgreSQL Row Security
Codd 23.04.2025
Современные облачные сервисы и бизнес-приложения всё чаще обслуживают множество клиентов в рамках единой программной инфраструктуры. Эта архитектурная модель, известная как мульти-тенантность, стала. . .
Реализация конвейеров машинного обучения с Python и Scikit-learn
AI_Generated 23.04.2025
Мир данных вокруг нас растёт с каждым днём, и умение эффективно обрабатывать информацию стало необходимым навыком. Специалисты по машинному обучению ежедневно сталкиваются с задачами предобработки. . .
Контроллеры Kubernetes Ingress: Сравнительный анализ
Mr. Docker 23.04.2025
В Kubernetes управление входящим трафиком представляет собой одну из ключевых задач при построении масштабируемых и отказоустойчивых приложений. Ingress — это API-объект, который служит вратами. . .
Оптимизация кода Python с Cython и Numba
py-thonny 23.04.2025
Python прочно обосновался в топе языков программирования благодаря своей простоте и гибкости. Разработчики любят его за читабельность кода и богатую экосистему библиотек. Но у этой медали есть и. . .
Микросервис на Python с FastAPI и Docker
ArchitectMsa 23.04.2025
В эпоху облачных вычислений и растущей сложности программных продуктов классическая монолитная архитектура всё чаще уступает место новым подходам. Микросервисная архитектура становится фаворитом. . .
Создаем веб-приложение на Vue.js и Laravel
Reangularity 23.04.2025
Выбор правильного технологического стека определяет успех веб-проекта. Laravel и Vue. js формируют отличную комбинацию для создания современных приложений. Laravel — это PHP-фреймворк с элегантным. . .
Максимальная производительность C#: Span<T> и Memory<T>
stackOverflow 22.04.2025
Мир высоконагруженных приложений безжалостен к неэффективному коду. Каждая миллисекунда на счету, каждый выделенный байт памяти может стать причиной падения производительности. Разработчики на C#. . .
JWT аутентификация в Java
Javaican 21.04.2025
JWT (JSON Web Token) представляет собой открытый стандарт (RFC 7519), который определяет компактный и самодостаточный способ передачи информации между сторонами в виде JSON-объекта. Эта информация. . .
Спринты Agile: Планирование, выполнение, ревью и ретроспектива
EggHead 21.04.2025
Спринты — сердцевина Agile-методологии, позволяющая командам создавать работающий продукт итерационно, с постоянной проверкой гипотез и адаптацией к изменениям. В основе концепции спринтов лежит. . .
Очередные открытия мега простых чисел, сделанные добровольцами с помощью домашних компьютеров
Programma_Boinc 21.04.2025
Очередные открытия мега простых чисел, сделанные добровольцами с помощью домашних компьютеров. 3 марта 2025 года, в результате обобщенного поиска простых чисел Ферма в PrimeGrid был найден. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru