LINUX.ORG.RU

29
Всего сообщений: 184

[решено] Работа над open-source С++/Qt приложением за $

UPD. Пока больше не ищу помощь.

Нужна помощь в проекте Xpiks. Xpiks - крос-платформенное приложение на C++/Qt/QML. Задания для фрилансера можно найти тут: https://github.com/ribtoks/xpiks/projects/6 в разделе TODO. Оплата зависит от условной сложности issue. За решения issue с меткой [trivial] - $10, [easy] - $50, [moderate] - $150. Issues с меткой [learning] хорошо подходят людям, не знакомым с проектом. Задание считается сделанным после принятия Pull Request. Перевод денег возможен либо по Paypal, либо туда, куда поддерживает Transferwise. Я помогаю по заданию через email или общение в GitHub Issues.

Сейчас над проектом работает 1-2 человек part-time. Я ищу только одного нового человека, которому такое будет интересно (на организацию больше человек у меня нету времени, к сожалению). Мне интересно «долгосрочное» сотрудничество, заданий есть очень много. Кого интересует такое, пишите на xpiks at outlook dot com. Мой часовой пояс - UTC-8 (Pacific Time) - на случай, если я не сразу отвечу.

 , ,

Ribtoks ()

Как исправить выравнивание чекбоксов в настройках системого трея kde?

  • plasma-5.16.4
  • qt-5.13

 , ,

zombi_pony ()

FluffyChat портирован на десктоп.

Выдержка из https://matrix.org/blog/2019/05/10/this-week-in-matrix-2019-05-10/:

FluffyChat is now also available as a Snap package for desktop Linux https://snapcraft.io/fluffychat :D
It’s a Matrix client written in Qml for Ubuntu Phones. Now it is working for Linux Desktop too.

Progress has been made at the end2end encryption for FluffyChat. Qml bindings for the libolm library are mostly ready and the app can now create keys and upload keys to the server. Device tracking is now implemented too.

E2E when? SOON! (Прогресс) See the branch here: https://gitlab.com/ChristianPauly/fluffychat/tree/e2eencryption

Осталось портировать на Android/iOS и будет кошерная альтернатива семейству Riot.

 , , , ,

commagray ()

QML на десктопе

Изучаю QML на примере Qt Quick Controls 2, но столкнулся с парой эпичных косяков:

  1. Ресайз окна приводит к пляскам виджетов (пример). Советуют использовать софтварный opengl, но это убивает всю идею QML.
  2. frameless window фактически нереализуем, так как при анимации пользовательские события блокируются. В итоге если у нас где-то крутится спинер - перемещать/ресайзить окно нельзя. При этом перемещать/ресайзить окно за пределы экрана тоже нельзя.

Вопрос к тем кто уже пытался что-либо соорудить на QML - как оно? Я так понимаю, что оно только для встройки, где окно всегда фиксированного размера.

Сам QML мне понравился, но пока я не найду решение хотя бы для первого пункта - я его использовать не могу.

 ,

RazrFalcon ()

QtWebEngine без QML

QtWebEngine в принципе можно собрать без QML? Как я понял, это жёсткая зависимость, но не понятно почему.

 ,

RazrFalcon ()

Новое видео про Qt и QML на русском

Учитывая холивар, который традиционно развернулся в новости о бесплатной конференции Qt в Москве, подолью маслица в огонь.

Недавно я выпустил видео, которое пополнило на Youtube немногочисленный ряд видеороликов о Qt и QML на русском языке:

Промышленная разработка на Qt и QML

Там рассказывается именно про реальный проект в области мобильной разработки, который имеет единую кодовую базу и под десктоп и под Android. Видео не обучающее, а скорее информационное, что такой вид разработки возможен и дает неплохой результат.

Спойлер: при подготовке видео я ошибся, и сказал что клиент Telegram написан на Qt+QML, это неправильно - там только Qt. На деле я смотрел код какого-то другого клиента, а мне почему-то запомнилось что это был телеграм.

Длительность ролика час, а я периодически говорю очень занудно, поэтому в описании к видео сделано содержание с метками времени на все обсуждаемые темы. Для особых гурманов там есть даже экономическая часть.

 , , ,

Xintrea ()

Добавить размытие фона виджету Plasma

Есть виджет RSS Indicator, классная вещь, но есть раздражающая деталь - фон не размыт как полагается. При этом у тултипов фон размыт, как у всей Плазмы.

https://pp.userapi.com/c846123/v846123463/1b2524/cYOWNbmx614.jpg

Как сделать фон самого виджета размытым?

Код самого виджета: https://github.com/cute-jumper/plasma-rss-indicator

 , ,

alexferman ()

Unit тесты в qml

Всем привет! Знающие люди, подскажите пожалуйста, как делать юнит тесты в qml? Вроде для этого есть специальный тип TestCase, но как быть если мои qml файлы зависят от объекта в c++ ?

 , ,

username007 ()

Создание фиктивного провайдера местоположения в Qt/QML - Странный сегфолт в Java

На основании обсуждения в теме «Самописный провайдер навигационных данных под Android - возможно ли такое?»...

Взяв за основу статью «Тестирование приложений в Android с использованием фиктивных данных о местоположении»...

Я сделал следующий проект:

https://github.com/xintrea/fakeLocationProviderOnQt

Он нужен мне для проверки того, может ли провайдер, созданный через метод addTestProvider(), поставлять данные геолокации для всей ОС Android (т. е. не только для приложения, в котором он запущен).

Проект должен быть на Qt/QML, поэтому вызовы Java-кода делаются через JNI. В данном примере есть просто две кнопки (Setup и Update), и при нажатии на каждую вызывается следующий Java-код:

    // Инициализация фиктивного провайдера
    public void setupFakeLocationProvider() {
        Log.w(TAG, "Java: setupFakeLocationProvider start");

        if(this==null) {
            Log.w(TAG, "For JniEventActivity this is null");
            return;
        }

        // Создание экземпляра класса MockLocationProvider
        // с контекстом данной Активности
        mock = new MockLocationProvider(LocationManager.GPS_PROVIDER, this);
        Log.w(TAG, "After new MockLocationProvider");

        //Set test location
        mock.pushLocation(45.0, 45.0);
        Log.w(TAG, "After mock.pushLocation");

        Log.w(TAG, "Java: setupFakeLocationProvider stop");
    }


    // Обновление значений координат в фиктивном провайдере
    public void updateFakeLocationProvider() {
        Log.w(TAG, "Java: updateFakeLocationProvider");
        // Пока ничего этот код не делает
    }
Вот это место в самом проекте: https://github.com/xintrea/fakeLocationProviderOnQt/blob/bdb675186094402a37c0...

Проблема в том, что при выполнении метода setupFakeLocationProvider(), выводится только строчка:
Java: setupFakeLocationProvider start

и больше строчек нет. Но сегфолта сразу не происходит, приложение как будто продолжает работать. И если нажать вторую кнопку, то выполнится метод updateFakeLocationProvider(), появится строка:
Java: updateFakeLocationProvider

и после этого произойдет сегфолт:
Core::setupFakeLocationProvider()): setupFakeLocationProvider from C++
W JniEventActivity: Java: setupFakeLocationProvider start
W libJniFakeLocationSample.so: ../JniFakeLocationSampleSrc/src/core/Core.cpp:119 (void Core::updateFakeLocationProvider()): updateFakeLocationProvider from C++
F art     : art/runtime/java_vm_ext.cc:410] JNI DETECTED ERROR IN APPLICATION: JNI CallVoidMethodV called with pending exception java.lang.IllegalStateException: System services not available to Activities before onCreate()
F art     : art/runtime/java_vm_ext.cc:410]   at java.lang.Object android.app.Activity.getSystemService(java.lang.String) (Activity.java:5381)
F art     : art/runtime/java_vm_ext.cc:410]   at void ru.farwater.gnss.fakelocsample.MockLocationProvider.<init>(java.lang.String, android.content.Context) (MockLocationProvider.java:16)
F art     : art/runtime/java_vm_ext.cc:410]   at void ru.farwater.gnss.fakelocsample.JniEventActivity.setupFakeLocationProvider() (JniEventActivity.java:91)
F art     : art/runtime/java_vm_ext.cc:410]   at void org.qtproject.qt5.android.QtNative.startQtApplication() (QtNative.java:-2)
F art     : art/runtime/java_vm_ext.cc:410]   at void org.qtproject.qt5.android.QtNative$6.run() (QtNative.java:359)
F art     : art/runtime/java_vm_ext.cc:410]   at void org.qtproject.qt5.android.QtThread$1.run() (QtThread.java:61)
F art     : art/runtime/java_vm_ext.cc:410]   at void java.lang.Thread.run() (Thread.java:833)
F art     : art/runtime/java_vm_ext.cc:410]
F art     : art/runtime/java_vm_ext.cc:410]     in call to CallVoidMethodV
F art     : art/runtime/java_vm_ext.cc:410]     from void org.qtproject.qt5.android.QtNative.startQtApplication()
F art     : art/runtime/java_vm_ext.cc:410] "qtMainLoopThread" prio=5 tid=10 Runnable
Полный текст ошибки: https://pastebin.com/D4SxRyYm

Насколько я понимаю, главная проблема в том, что «System services not available to Activities before onCreate()».

Она возникает в конструкторе класса MockLocationProvider на строке:
LocationManager lm = (LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE);

Вот это место в коде: https://github.com/xintrea/fakeLocationProviderOnQt/blob/bdb675186094402a37c0...

Люди в интернете говорят, что проблема может быть из-за того, что переменная ctx (в которую передается указатель на текущую Activity) просто не определена, так как у активности еще не вызван метод onCreate(): https://ru.stackoverflow.com/questions/448723/Ошибка-java-lang-illegalstateex...

Но в данном случае у меня активность создается задолго до того, как пользователь будет нажимать на кнопки для вызова Java-кода.

В общем, в чем может быть проблема, как ее исправить?

 , , , ,

Xintrea ()

Как в QML нарисовать прямоугольник на весь экран из любого уровня вложенности?

В QML можно позиционировать элементы только относительно элементов того же уровня или относительно родителя. И координатная система элемента тоже рассчитывается как относительная относительно координатной системы родителя.

Однако может встать задача спозиционировать элемент относительно экрана на любом уровне вложенности.

Например, если сделан элемент «Небольшое окно уведомления с кнопкой OK», который используется в разных частях программы, то он должен иметь возможность сделать прямоугольную область MouseArea на весь экран. Эта область должна располагаться под элементами данного окна, чтобы не давать нажимать на другие элементы интерфейса программы, которые находятся за данным окном. Ну, то есть, поведение как у модального окна.

Выглядит это примерно так:

Item {
    id: root

    width: sizeMetric*0.4
    height: sizeMetric*0.5

    // Область клика мышкой на весь экран чтобы невозможно было кликнуть под элементами сообщения
    Rectangle {
        id: fullScreenRectangle

        width: mainWindow.width
        height: mainWindow.height

        anchors: - как?

        color: "#80101010"

        MouseArea {
            id: fullScreenMouseArea

            anchors.fill: parent

            onClicked: {
                console.log("Disable click under message");
            }
        }
    }

    // Элементы окна
    Rectangle {
        id: windowInterface

        anchors.fill: parent
        ...
    }
}

Элемент fullScreenRectangle можно позиционировать только относительно root или windowInterface. Но элемент root не имеет информации о своем настоящем положении на экране, во всяком случае я не знаю как эту информацию получить.

Если сделать так:
Rectangle {
        id: fullScreenRectangle

        width: mainWindow.width
        height: mainWindow.height

        x: 0
        y: 0
        ... 
}

То прямоугольник будет отрисован не относительно 0,0 экрана, а относительно 0,0 элемента root.

В общем, вопрос в том, как можно в QML позиционироваться относительно экрана.

 , , ,

Xintrea ()

Как отловить момент «выталкивания» (pop) страницы в StackView в QML?

Все приложение у меня построено на StackView. В приложении есть страница выбора файла, которое используется в нескольких частях приложения. В коде она описана так:

    StackView {
        id: stackView

        ...

        // Страница с виджетом выбора файла
        Component {
            id: fileSelectDialogComponent

            FileSelect {
                id: fileSelectDialog
                anchors.fill: parent
                enabled: Stack.status === Stack.Active
            }
        }

Выбор файла вызывается так:
// Вызывается диалог выбора файла
qmlGlobalParameters.fileSelectDialogStartDirectory="тут_имя_директории";
qmlGlobalParameters.fileSelectDialogStartFileName="тут_имя_файла";
qmlGlobalParameters.fileSelectDialogResult="";
stackView.push( fileSelectDialogComponent );

Страница выбора файла сама себя закрывает через вызов pop() для stackView при нажатии кнопки Ok или Cancel.

Теперь сами проблемы:

Так как тип Component не позволяет создавать себе свойства, а позволяет только задавать идентификатор id, то я не могу «вытащить» fileSelectDialog как свойство property alias для fileSelectDialogComponent. Поэтому мне приходится передавать параметры в объект fileSelectDialog не напрямую (потому что я достучаться до него не могу), а через глобальный объект qmlGlobalParameters, о котором «знает» и вызывающий код, и сам тип fileSelectDialog. И это мне очень не нравится. Я сделал вот так «чтоб работало», но хочу переделать так, чтобы по нормальному передавать данные в объект, а так же чтобы иметь возможность работать с сигналами этого объекта.

Но пока этого не сделано, мне нужно научиться ловить момент «выталкивания» компонента fileSelectDialogComponent из стека, чтобы обработать сделанный в этом компоненте выбор файла. В StackView нет сигналов, которые бы вызывались при действии pop(). Привязаться к сигналам fileSelectDialog я не могу, потому что он сидит внутри fileSelectDialogComponent, и потому достучаться до него невозможно. У самого типа Component объекта fileSelectDialogComponent тоже нет сигналов, оповещающих о том что он выталкивается из стека. В общем, везде какие-то странные ограничения, из-за которых я не могу поймать момент завершения работы страницы выбора файла.

Вопрос: как можно отловить этот момент в существующей структуре кода? А как можно изменить код, чтобы вышеуказанных проблем не стояло в принципе?

 , , , ,

Xintrea ()

Как в QML на объекте Map наиболее оптимизированно показать часть QGeoPath?

Имеется объект класса QGeoPath, который хранит ~3500 точек. Заказчик требует, чтобы в программе была настройка, какую часть запомненного трека отрисовывать. Условно говоря, 150 точек, 300 точек, 500 точек, 1000, 2000, полный трек.

В самом классе QGeoPath нет возможности указать, на какой точке остановиться при отрисовке трека. Поэтому с таким классом видится только два пути:

1. Делать копию объекта, укорачивать до нужной длинны, и этот объект и отрисовывать на карте Map.
2. Или копировать только нужные данные из этого объекта в отображаемый и отрисовывать его на карте Map. (Возможно, это более оптимизированно, чем вариант 1, но не факт).

Небольшие подробности: экземпляр QGeoPath пополняется новыми точками 10 раз в секунду. Пока трек не достиг длинны 3500 точек, новые точки просто добавляются в «голову». Когда длинна становится 3500, работает алгоритм «змейки», то есть в голову добавляется точка, и в «хвосте» точка удаляется.


Класс QGeoPath - это, по сути, QList<QGeoCoordinate>. То есть, это не массив, а очень фрагментированная в памяти структура. Делать с нее копию таких данных 10 раз в сек, только для того, чтобы показать _часть_ данных - это какой-то дикий оверхед.

Вопрос: как можно извратиться так, чтобы отображать часть трека наиболее оптимизированным способом?

 , , ,

Xintrea ()

Тупит QML на примитивном коде - что ему еще надо? (С видео)

Сделал вот такой минимальный пример:

import QtQuick 2.6
import QtQuick.Window 2.2

Window {
    visible: true
    width: 500
    height: 500

    Rectangle
    {
        anchors.fill: parent
        color: "blue"
    }

    Rectangle
    {
        x: 0
        y: 0
        width: 100
        height: 100
        color: "red"
    }
}

Это просто окно с синим фоном и красным прямоугольником в левом верхнем углу.

Казалось бы, что тут может глючить? А глюки начинаются, когда меняется размер окна. Скриншоты сделать не могу, потому что в момент создания скриншота, окна, похоже, перерисовываются, и скриншот получается с «правильным» содержимым.

Поэтому выкладываю видео: https://youtu.be/0ewK6jrqWms

Видно, что если два раза нажать «Развернуть», то содержимое окна становится неправильным: синяя заливка начинается не сверху окна, а с каким-то вертикальным отступом. Красный квадрат тоже смещен вниз на этот же отступ.

Если двигать окно, то содержимое окна остается неправильным, но в какой-то момент вдруг перерисовывается, и снова становится правильным.

Вопрос: в чем проблема, и как сделать так, чтобы окно всегда отрисовывалось правильно?

 , ,

Xintrea ()

Почему-то не вычисляется выражение в QML (с картинками)

Делаю я тип MetallFramePlanarButton.qml для отрисовки кнопки. Делается на базе типа Item. Предполагается, что кнопка квадратная. В нем сделано свойство scaleFactor (используемое для масштабирования внутренних элементов):

Item {
    id: root
    
    ...

    property double scaleFactor: buttonFrame.implicitWidth===0 ? 0 : root.width/buttonFrame.implicitWidth

    // Размер кнопки задается шириной. Кнопка квадратная
    height: root.width

    onWidthChanged: {
        setButtonFrameSize();
    }

    onHeightChanged: {
        setButtonFrameSize();
    }

    // * Установка размера картинки рамки *
    function setButtonFrameSize() {
        // Напрямую устанавливать значения нельзя
        var w=buttonFrame.implicitWidth*root.scaleFactor;
        var h=buttonFrame.implicitHeight*root.scaleFactor;

        buttonFrame.width=w;
        buttonFrame.height=h;
    }

    ... 

    // Металлическая рамка
    // Относительно нее считаются размеры и смещения всех остальных элементов в кнопке
    Image {
        id: buttonFrame

        source: "qrc:/resource/pic/button/metallFramePlanarButton/buttonCase.png"
        fillMode: Image.PreserveAspectFit
    }

}

Используется эта кнопка с указанием ширины:
MetallFramePlanarButton {
        id: exitToMainMenuButton

        iconSource1: "qrc:/resource/pic/mapTools/buttons/iconMenu.png"

        width: root.buttonSize
    }

Так вот, ставлю я брекпоинт в функцию setButtonFrameSize(), чтобы посмотреть как вычисляются w и h. И вижу, что они равны нулю:

http://i.piccy.info/i9/2094984c903235facac02d77768cd2b3/1543847738/275438/128...

Почему же, например, w равно нулю? Потому что:

buttonFrame.implicitWidth = 169
root.scaleFactor = 0

Умножение на 0 дает 0. Теперь вопрос, а почему root.scaleFactor нуливой? Дублирую выражение, которым это свойство вычисляется, чтобы оно вычислилось в отладчике (его видно справа вверху, нижняя строчка:
buttonFrame.implicitWidth===0 ? 0 : root.width/buttonFrame.implicitWidth

И это выражение дает значение 0.53. Это совсем не 0!

http://i.piccy.info/i9/1bf478f285b85c332fa833252893bd8b/1543853567/207581/128...

То есть, если вычислить выражение в отладчике, оно дает ненулевое значение. То же самое выражение, присвоенное свойству scaleFactor, имеет значение 0.

Почему так?

 , , ,

Xintrea ()

Как в QML StackView отследить момент его создания?

У меня все экраны QML-приложения уложены в «основной» объект типа StackView.

Возникла задача запоминать, какой экран был при выключении приложения, и восстанавливать его при включении. Для простоты можно считать, что что есть первый экран «меню» (это initialItem), и из него возможен переход на экран «режим1» или на экран «режим2». Таким образом, после создания StackView, по сути надо сделать одну-единственную команду, например:

stackView.push( mode1StackComponent );

Проблема в том, что я не могу понять в как и в каком месте кода отловить момент создания экрана «меню», чтобы выполнить эту команду. Код примерно такой:
    StackView {
        id: stackView

        anchors.fill: parent
        focus: true
        initialItem: mainMenuStackComponent

        // Окно с основным меню
        Component {
            id: mainMenuStackComponent

            MainMenu {
                id: mainMenu
                enabled: Stack.status === Stack.Active
            }
        }

        // Окно режима 1
        Component {
            id: mode1StackComponent

            Mode1 {
                id: mode1
                enabled: Stack.status === Stack.Active
            }
        }

        // Окно режима 2
        Component {
            id: mode2StackComponent

            Mode2 {
                id: mode2
                enabled: Stack.status === Stack.Active
            }
        }
    }

Я пробовал добавлять код:
Component.onCompleted: {
    stackView.push( mode1StackComponent );
    console.warn("Auto call");
}

В блок с id:mainMenu, но тогда появляется ошибка:
qml: Warning: StackView: You cannot push/pop recursively!
__recursionGuard (file:///opt/qt_5_11_2/5.11.2/gcc_64/qml/QtQuick/Controls/StackView.qml:791)
push (file:///opt/qt_5_11_2/5.11.2/gcc_64/qml/QtQuick/Controls/StackView.qml:568)
onCompleted (qrc:/qmlCode/main.qml:77)
__loadElement (file:///opt/qt_5_11_2/5.11.2/gcc_64/qml/QtQuick/Controls/StackView.qml:825)
__performTransition (file:///opt/qt_5_11_2/5.11.2/gcc_64/qml/QtQuick/Controls/StackView.qml:911)
push (file:///opt/qt_5_11_2/5.11.2/gcc_64/qml/QtQuick/Controls/StackView.qml:605)
expression for onCompleted (file:///opt/qt_5_11_2/5.11.2/gcc_64/qml/QtQuick/Controls/StackView.qml:777)
qml: Auto call

Видимо, это связано с тем, что onCompleted() в QML не гарантирует создания подчиненных элементов к моменту своего срабатывания.

Поэтому не могу сообразить, как еще можно сделать автоматическое открытие «окна второго уровня» в StackView с помещением базового окна «меню» в стек.

 , ,

Xintrea ()

Как вызвать стандартный диалог «Поделиться»/«Отправить» в Android из Qt/QML?

Есть QML-приложение. В нем есть имя файла с полным путем.

Нужно открыть стандартный диалог «Поделиться» или «Отправить файл», в котором этот файл можно отправить через GMail, Hangout, WatsApp, BlueTooth и проч.

Вопрос: как это сделать?

Я пока что умею открывать диалог связанного (ассоциированного) приложения(ний):

QDesktopServices::openUrl(QUrl::fromLocalFile(fileName));

А вот как открыть диалог «Поделиться» или «Отправить файл» понять не могу.

 , , , ,

Xintrea ()

Qt/QML деплой, qml файлы или убрать или засунуть в ресурсы

В документации написано, что с версии Qt 5.2 достаточно положить плагин quick controls и qmldir файл в подкаталог каталога где лежит бинарник приложения. Но если так сделать то будут ошибки на отсутствие стандартных (тех которые из исходников Qt) qml файлов типа Label.qml. Если добавить отсутствующие *.qml файлы из исходников Qt то всё работает.

Вопрос, документация врёт, что *.qml не нужны и что они якобы уже находятся в ресурсах скомпилированного плагина QuickControls? Обязательно ли таскать *.qml файлы из исходников Qt вместе со своим приложением? Нельзя ли *.qml файлы из исходников Qt засунуть в ресурсы своего приложения? Я пробовал добавить в ресурсы, но это не сработало.

 ,

Golanger ()

QML: «адаптивный» дизайн. Что очень краткого можно почитать по теме?

Вожусь с QML. С функциональностью справился, но вот информация как бы сделать интерфейс растягивающимся на любое разрешение не очень-то и гуглится.
Пару обзорных статеек и всё. Опыта в этом деле у меня нет, так что нужно что-то самодостаточное и дающее информацию в полном объёме.
Сам интерфейс тривиален: ListView, пару слайдеров и кнопок. Так что ничего особо хитрого не нужно.

 ,

ZweiStein ()

QML: Unable to assign [undefined] to

/me выдыхает, успокаивается и готовится излагать без матов и излишней предвзятости.

Для программы под Андроид решил перевести интерфейс на QML. До этого с ним дел не имел (и, похоже, никогда больше не буду), поэтому могу тупить на ровном месте.

Основа интерфейса ListView:
Выглядит так:

    ListView
    {
        id: listView
        x: 16
        y: 146
        width: 262
        height: 282
        model: myModel
        delegate: Item
        {
            x: 5
            width: 80
            height: 40
            Row
            {
                id: row1
                spacing: 10
                Text
                {
                    width: 50
                    text:model.modelData.getPassword
                    font.bold: true
                    anchors.verticalCenter: parent.verticalCenter
                }
                ProgressBar
                {
                    value: model.modelData.getDifficulty
                }
            }
        }
    }


В main() заполняю список так:
	QList<QObject*> dataList;
	dataList.append(new DataObject("Item 1", 50));
	dataList.append(new DataObject("Item 2", 60));
	dataList.append(new DataObject("Item 3", 70));
	dataList.append(new DataObject("Item 4", 80));


	QGuiApplication app(argc, argv);
	qmlRegisterType<BackEnd>("tk.asciigames.backend", 1, 0, "BackEnd");

	QQmlApplicationEngine engine;

	engine.rootContext()->setContextProperty("myModel", QVariant::fromValue(dataList));

	engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

	return app.exec();


DataObject выглядит так:
class DataObject : public QObject
{
	Q_OBJECT

	Q_PROPERTY(QString password			READ getPassword)
	Q_PROPERTY(unsigned int difficulty	READ getDifficulty)
public:
	DataObject(QString _pass, unsigned int _difficulty)
	{
		difficulty = _difficulty;
		password = _pass;
	}

	QString getPassword()
	{
		return password;
	}

	unsigned int getDifficulty()
	{
		return difficulty;
	}

private:
	unsigned int	difficulty;
	QString			password;

};


При запуске таблица визуально имеет 4 строки (как и ожидалось), но данных нет. В логах ошибки вида
qrc:/main.qml:118:26: Unable to assign [undefined] to QString
qrc:/main.qml:124:28: Unable to assign [undefined] to double


Ошибки соответствуют QML-ным строкам
text:model.modelData.getPassword
value: model.modelData.getDifficulty


Т.е. массив со стороны QML, похоже, виден, но вытащить непосредственные значения он не может.

Подскажите, у кого глаз намётан на такие вещи...

 ,

ZweiStein ()

Показать карту OpenSeaMap через плагин «osm» в QML

Имею Qt 5.10.1, Linux Debian 9 Stable.

Хочу сделать очень простую вещь: показать карту с тайлового сервера OpenSeaMap через плагин «osm».

Читаю документацию тут:

https://doc-snapshots.qt.io/qt5-5.10/location-plugin-osm.html

Читаю поправку к документации тут:

https://bugreports.qt.io/browse/QTBUG-55176

Использую такой код:

    // Карта OSEAM
    Map {
        id: mapOseam
        gesture.enabled: true
        anchors.fill: parent
        center: QtPositioning.coordinate(59.9758,29.7686)
        zoomLevel: 15

        // Если раскомментировать - будет сегфолт
        // supportedMapTypes: MapType.CustomMap


        // Плагин OSM с картой OSEAM
        plugin: Plugin {
            name: "osm"

            PluginParameter {
                name: "osm.mapping.custom.host"
                value: "http://tiles.openseamap.org/seamark/"
            }

            PluginParameter {
                name: "osm.mapping.cache.directory"
                value: "./mapCache/oseam"
            }

            PluginParameter {
                name:"osm.mapping.providersrepository.disable"
                value:true
            }

        }
    }

Перед каждым запуском директорию с кешем очищаю. Но все равно все время показывается карта OpenStreetMap, а не OpenSeaMap.

Я уже игрался как мог, ставил osm.mapping.providersrepository.disable в false, писал вместо http://tiles.openseamap.org/seamark/ сервер http://t1.openseamap.org/seamark/, комментировал/раскомментировал supportedMapTypes, пробовал прописывать activeMapType, но ничего не меняется: все время отображается OpenStreetMap, несмотря на то что указан другой тайловый сервер.

Вопрос: как таки заставить плагин «osm» обращаться к другому тайловому серверу?

 , , , ,

Xintrea ()