Error importing "Esri.ArcGISRuntime" to Qt Creator - qt

After running the code an error came:
QQmlApplicationEngine failed to load component
qrc:/main.qml:19:1: module "Esri.ArcGISRuntime" is not installed
I am using Qt Creator 4.11.1 Qt 5.14.1
I am using Ubuntu 20.04
I have already added the path to the LD_LIBRARY_PATH as stated here: https://developers.arcgis.com/qt/install-and-set-up/
I have restarted the Qt Creator and my system but still not working.
Any suggestions?
The code is:
main.qml
import QtQuick 2.6
import QtQuick.Controls 2.2
import Esri.ArcGISRuntime 100.14 //error here
Rectangle {
id: rootRectangle
clip: true
width: 800
height: 600
readonly property int initialZoomScale: 8000
property bool trackingEnabled: false
property Point lastPosition: null
// add a mapView component
MapView {
anchors.fill: parent
Map {
Basemap {
initStyle: Enums.BasemapStyleArcGISDarkGray
}
}
// set initial viewpoint near UCLA, Los Angeles
ViewpointCenter {
Point {
x: -13185535.98
y: 4037766.28
}
targetScale: initialZoomScale
}
Button {
id: button
text: trackingEnabled ? "Stop tracking" : "Start tracking"
anchors.horizontalCenter: parent.horizontalCenter
width: 200
onClicked: trackingEnabled =! trackingEnabled
}
SimulationParameters {
id: simulationParameters
velocity: 30
}
locationDisplay {
dataSource: SimulatedLocationDataSource {
id: simulatedLocationDataSource
Component.onCompleted: {
setLocationsWithPolylineAndParameters(polyline, simulationParameters);
simulatedLocationDataSource.start();
}
}
initialZoomScale: initialZoomScale
}
// if tracking is enabled then show location history
locationDisplay.onLocationChanged: {
if (!trackingEnabled)
return;
// clear old route
locationHistoryLineOverlay.graphics.clear();
if (lastPosition !== null) {
polylineBuilder.addPoint(lastPosition);
locationHistoryOverlay.graphics.append(ArcGISRuntimeEnvironment.createObject("Graphic", {geometry: lastPosition}));
}
// update last position
lastPosition = locationDisplay.location.position;
// update the polyline
locationHistoryLineOverlay.graphics.append(ArcGISRuntimeEnvironment.createObject("Graphic", {geometry: polylineBuilder.geometry}));
}
Component.onCompleted: {
// Set the focus on MapView to initially enable keyboard navigation
forceActiveFocus();
locationDisplay.autoPanMode = Enums.LocationDisplayAutoPanModeRecenter;
}
Polyline {
id: polyline
json: {"paths":[[[-13185646.046666779,4037971.5966668758],[-13185586.780000051,4037827.6633333955],
[-13185514.813333312,4037709.1299999417],[-13185569.846666701,4037522.8633330846],
[-13185591.01333339,4037378.9299996048],[-13185629.113333428,4037283.6799995075],
[-13185770.93000024,4037425.4966663187],[-13185821.730000293,4037546.146666442],
[-13185880.996667018,4037704.8966666036],[-13185948.730000421,4037874.2300001099],
[-13185974.130000448,4037946.1966668498],[-13186120.180000596,4037958.896666863],
[-13186264.113334076,4037984.296666889],[-13186336.080000836,4038001.2300002342],
[-13186314.91333415,4037757.8133333195],[-13186272.580000773,4037560.9633331187],
[-13186187.913334005,4037463.59666635],[-13186431.33000092,4037404.3299996229],
[-13186676.863334503,4037290.0299995062],[-13187625.130002158,4038589.6633341513],
[-13187333.030001862,4038756.8800009824],[-13187091.730001617,4038617.1800008402],
[-13186791.163334643,4038805.5633343654],[-13186721.313334571,4038801.3300010278],
[-13186833.49666802,4038195.9633337436],[-13186977.677439401,4037699.8176972247],
[-13186784.921301765,4037820.4541915278],[-13186749.517113185,4038150.8932846226],
[-13186649.860878762,4038288.5762400767],[-13186556.760975549,4038323.9804286221],
[-13186472.839936033,4038481.3323777127],[-13186373.183701571,4038489.1999751539],
[-13186344.335844241,4038242.6819215398],[-13186126.665647998,4038308.245233661],
[-13185814.584282301,4038358.0733508728],[-13185651.987268206,4038116.8003622484],
[-13185203.534213299,4038048.6145176427],[-13184576.748949422,4038150.8932845518],
[-13184251.55492135,4037833.5668537691],[-13184146.653621957,4037524.1080205571],
[-13183949.963685593,4037621.1417224966],[-13183687.71043711,4037781.1162040718],
[-13183480.530370807,4037875.5273735262],[-13182307.629999243,4037859.7460188437],
[-13181376.039484169,4037820.9297473822],[-13180716.162869323,4038364.3575478429],
[-13180182.439136729,4038810.7446696493],[-13178474.523192419,4040237.2426458625],
[-13178321.134040033,4039740.6894803117],[-13177958.020228144,4039140.1550991111],
[-13177073.512224896,4037459.5898928214],[-13177757.842101147,4037589.9384406791],
[-13178386.308314031,4037799.427178307],[-13180095.012208173,4037811.6550856642],
[-13180126.165447287,4036845.9046731163],[-13179806.844746364,4036324.0879179495],
[-13180928.361354485,4035887.9425703473],[-13181598.155995468,4035428.432293402],
[-13182984.47513606,4034447.105261297],[-13182229.264383668,4033222.8051626245],
[-13182058.735615831,4033339.8690072047],[-13181939.035180708,4033691.2477038498],
[-13182116.65518121,4033861.1450956347],[-13181792.305615077,4034085.1007484416],
[-13182027.845180977,4034467.3698799671],[-13181877.254310986,4034644.9898804692],
[-13181630.130832028,4034517.5668366305],[-13181386.868657427,4034424.8955320208],
[-13181228.555178719,4034652.7124891868],[-13181379.14604871,4034942.3103160923],
[-13181267.168222306,4035189.4337950516],[-13181074.103004368,4035015.6750989081],
[-13180807.673003616,4034934.5877073747],[-13180618.469090037,4034814.8872722536],
[-13180599.162568243,4035374.7764042714],[-13181047.073873857,4035494.476839392],
[-13181317.365178969,4035413.3894478586],[-13180765.198655669,4035143.0981427468],
[-13180328.871263131,4034892.1133594285],[-13180270.951697765,4035258.9372735149],
[-13180325.009958787,4035718.4324922049],[-13180707.279090302,4035695.2646660525],
[-13181413.897788007,4035536.9511873648],[-13181618.54691902,4035807.2424924765],
[-13181884.976919774,4036065.949884512],[-13182159.129529245,4035861.3007534989],
[-13182174.57474668,4035668.2355355616],[-13182417.83692128,4035664.374231203],
[-13182784.660835361,4035409.5281435261],[-13182997.032575091,4035255.0759691764],
[-13182618.624747934,4034679.7416197238]]],
"spatialReference":{"latestWkid":3857,"wkid":102100}}
}
GraphicsOverlay {
id: locationHistoryLineOverlay
SimpleRenderer {
SimpleLineSymbol {
color: "lime"
style: Enums.SimpleLineSymbolStyleSolid
width: 2
}
}
}
GraphicsOverlay {
id: locationHistoryOverlay
SimpleRenderer {
SimpleMarkerSymbol {
color: "red"
style: Enums.SimpleMarkerSymbolStyleCircle
size: 3
}
}
}
}
PolylineBuilder {
id: polylineBuilder
spatialReference: SpatialReference { wkid: 3857 }
}
}

I will summarise the issues discussed in the comment thread to bring to an end.
Use Qt 5.15 these days and preferably always the latest bug fix release. Which is currently 5.15.5 for open-source, and not commercial, customers at the time of writing this. Even better to switch to 6.x when possible.
Setting the QML_IMPORT_TRACE environment variable can help debugging these issues.
When using qmake, they seem to suggest including their pri file to your qmake pro file.
Something like a export QML2_IMPORT_PATH=..:$QML2_IMPORT_PATH can also help localising these issues as a quick experiment.

Related

(Qt for WebAssembly) MultiPointTouchArea loses all touchpoints after just one is released

If I run the following code in the browser using Qt for webassembly I can shift points around, but if one of the two is released, shifting no longer works and this console messages appears:
qt.pointer.dispatch: skipping QEventPoint(id=1 ts=0 pos=0,0 scn=869,370 gbl=869,370 Updated ellipse=(8x8 ∡ 0) vel=0,0 press=-869,-370 last=-869,-370 Δ 869,370) : no target window
import QtQuick
Window {
visible: true
Rectangle {
anchors.fill:parent
MultiPointTouchArea {
anchors.fill: parent
touchPoints: [
TouchPoint {
id: point1
onPressedChanged: console.log('point1', pressed);
},
TouchPoint {
id: point2
onPressedChanged: console.log('point2', pressed);
}
]
}
Rectangle {
width: 200; height: width;
color: "red"
x: point1.x
y: point1.y
}
Rectangle {
width: 200; height: width;
color: "green"
x: point2.x
y: point2.y
}
}
}
I tested it with versions Qt5.15.2, Qt6.4.2, Qt6.5
and different browsers, but the same error occurs all the time.
Link "test it yourself" Online live qml wasm
I debugged a little and it seems the error is in file:
C:\Qt\6.5.0\Src\qtbase\src\gui\kernel\qguiapplication.cpp
Line 2924:
QPointer<QWindow> window = e->window; // the platform hopefully tells us which window received the event
Line 2961:
// If we somehow still don't have a window, we can't deliver this touchpoint. (should never happen)
if (Q_UNLIKELY(!window)) {
qCWarning(lcPtrDispatch) << "skipping" << &tempPt << ": no target window";
continue;
}
here the window is lost.
How can i debug it further?
I also tested it with Qt under Windows, Linux, Android using diffrent versions. There everything works as expected (only using WebAssembly in the browser it doesn't)
If you check the signals of MultiPointTouchArea you see that you get passed a touchPoints array as an argument. This array is valid during the signal handler, and, you need to react accordingly. The following code runs in WebAssembly and you can test it out on a multitouch device:
import QtQuick
import QtQuick.Controls
Page {
background: Rectangle { color: "#848895" }
property list<string> status
MultiPointTouchArea {
anchors.fill: parent
onCanceled: msg(`onCanceled: ${touchPoints.length}`);
onPressed: msg(`onPressed: ${touchPoints.length}`);
onGestureStarted: msg(`onGestureStarted: ${touchPoints.length}`);
onReleased: msg(`onReleased: ${touchPoints.length}`);
onTouchUpdated: msg(`onTouchUpdated: ${touchPoints.length}`);
onUpdated: msg(`onUpdated: ${touchPoints.length}`);
Frame {
anchors.centerIn: parent
background: Rectangle { }
Text {
text: status.join('\n');
}
}
}
function msg(str) {
status.push(str);
if (status.length > 20) status.shift();
}
}
You can Run it WebAssembly now

QML TypeError: Property 'xx' of object yy is not a function

I have this main.qml:
import QtQuick 2.13
import QtQuick.Window 2.13
import QtQuick.Controls 2.5
ApplicationWindow {
...
Item {
// This Item is to provide needed properties for functionality in the original app that was elided out in this example.
// It was left in in case it's relevant to the problem.
...
Column {
...
Text {
text: qsTr("Masked text")
SlidingMask {
id: testMask
anchors.fill: parent
...
}
}
Row {
Button {
id: btnRevealText
text: qsTr("Reveal")
...
}
Button {
id: btnHideText
text: qsTr("Hide")
...
}
}
}
}
Connections {
target: btnRevealText
onPressed: testMask.reveal()
}
Connections {
target: btnHideText
onPressed: testMask.hide()
}
}
And this SlidingMask.qml that's registered in the qml.qrc:
import QtQuick 2.0
Rectangle {
...
function hide() {
...
}
function reveal() {
...
}
}
When I run the app and try to press the buttons, I get the following errors:
TypeError: Property 'hide' of object SlidingMask_QMLTYPE_7(0x19991132c50) is not a function
TypeError: Property 'reveal' of object SlidingMask_QMLTYPE_7(0x19991132c50) is not a function
However, if I try changing the Connections to alter a property of the SlidingMask instead of calling a function, it works fine.
I've also tested this component previously and didn't run into any problems then, although I wasn't using Connections in that test.
I've searched here and on Google for an answer, but nothing I've found seems relevant to my situation. How would I fix this?
Here is a simple example which works properly:
//main.qml
ApplicationWindow {
id: window
width: 640
height: 480
visible: true
Column{
ItemWithFunction{
id: sc
width: 100
height: 100
}
Button{
id: btn1
text: 'Test Connection'
}
}
Connections{
target: btn1
onPressed: sc.testFunction();
}
}
//ItemWithFunction.qml
Rectangle{
color: 'red'
function testFunction(){
console.log("SOMETHING HAPPENED")
}
}
It seems that you are not putting your functions in SlidingMask root but in one of its child components.

how to regenerate an UI stochastically in QML using a Button on the interface?

I am working on the following QML framework for music apps user-interface prototyping:
https://github.com/tiagmoraismorgado/TMM_QML_UI_UX_FRAMEWORK_WIP in the file instiationTest, i need to add a type Button1_1 and then use it to regenerate the whole gui based on combostochasticselector.
i know i have to instantiate the randomPicking() function, from the instantiationtest file, on top of the mouseArea Pressed statement of Button1_1, but i am not being able to do so.
if anyone could provide me any insight i would be pretty thankful
here is the code of the main file
(...)
Window {
id: root
width: Screen.width
height: Screen.height
visible: true
visibility: "FullScreen"
title: qsTr("instantiationTest")
color: "black"
CombosStochasticSelector {}
}
on the combostochasticselector, you can see the following:
Item {
property var model: model1
anchors.fill: parent
id: randomMIDIkeyboardSelector;
property var random: 0;
function randomSelection(min, max) {(...)}
function createMidiKeyboard(itemToBeInstantiated) {
var component = Qt.createComponent(itemToBeInstantiated)
if (component.status === Component.Ready) {
var midiKeyboard = component.createObject(randomMIDIkeyboardSelector, {model: model});
}
else if (component.status === Component.Error) {
}
}
function randomPicking() {
random = parseInt(randomSelection(1, 13));
if(random == 1) {createMidiKeyboard("./../_Combos/Combo1.qml");}
(...)
return random;
}
Component.onCompleted: {
randomPicking();
}
}
on the Button1_1 you can see the following:
import QtQuick 2.6
QMLOpenGLToggleButtonPrimitive {}
It instantiates a press released kind of button made out of Rectangle QML Primitives
kind regards
Tiago

changing property of element from other qml file

I know that there is tons of topic similar like this, I try to implement answer from them and I still have no results.
I take some sample project from qt creator to play with this. I play with changing visibility of qml files ( treat every file as other screen). After lunching 3rd screen I want to make the second one invisible.
Here Is the code where I want change property in it:
MyLuncherList.qml
import QtQuick 2.0
Rectangle {
Item
{
id:ei
visible:false
clip: true
property url itemUrl
onItemUrlChanged:
{
visible = (itemUrl== '' ? false : true);
}
anchors.fill: parent
anchors.bottomMargin: 40
Rectangle
{
id:bg
anchors.fill: parent
color: "white"
}
MouseArea
{
anchors.fill: parent
enabled: ei.visible
//takes mouse events
}
Loader
{
focus:true
source: ei.itemUrl
anchors.fill: parent
}
}
}
and here is the code where I want to make a action
View2.qml
import QtQuick 2.0
Rectangle {
width: 100
height: 62
Text
{
text: "second screen"
}
MyLuncherList
{
id:luncherList
}
Rectangle
{
x: 50
y: 30
width: 120
height: 60
color: "red"
MouseArea
{
anchors.fill: parent
id: mouseAreaWhichHides
onClicked:
{
luncherList.ei.itemUrl = '';
}
}
}
}
and I got the error: qrc:///View2.qml:29: TypeError: Type error
which point on this line luncherList.ei.itemUrl = '';
Type error says that I make some mismatch with Type, but I’m not even sure, if I do this access process in properly way, so I’m asking how to change property of
ei.itemUrl
from
View2.qml
in working way.
The ei element won't be available directly in other QML file.
You can use an alias to do it.
property alias callUrl: ei.itemUrl
and call it from other QML file
luncherList.callUrl='file:///home/user/file.jpg'

How to use the setMetadata(key,value) method in QtMultimidia CameraCapture QML Type?

I'm interested in setting GPS location metadata to captured images in QML. I noticed the setMetadata(key,value) method in several qml capture elements but I can't understand how it works, or find any examples.
The definition in the documentation states:
"Sets a particular metadata key to value for the subsequent image
captures."
http://qt-project.org/doc/qt-5/qml-qtmultimedia-cameracapture.html
Does the method work? if so, please place a simple example.
If not, is there any other way to set (or edit) image metadata (even if use of C++ is necessary) in Qt?
Update (but not solved):
I've tried the following code, the app runs on desktop takes the picture and saves it. After I open it up with Preview (MAC) and check the metadata... and nothing special there (no comment key).
Camera {
id: camera
captureMode: Camera.CaptureStillImage
Component.onCompleted: {
imageCapture.setMetadata("Comment","My Picture")
}
imageCapture {
resolution: "640x480"
onImageCaptured: {
console.log("Image Captured Callback : Preview : "+preview)
}
onImageSaved: {
console.log("Image Saved Callback : Save Path : "+path)
}
onImageMetadataAvailable: {
console.log("Image Metadata Callback : "+key+" = "+value)
}
}
}
I think you should use a subset of the keys documented here before you start the capture.
edit
FWIW, here is a minimal test on Ubuntu, Qt 5.3 - I created an empty application, added a menu command, the camera and viewer
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Window 2.0
import QtMultimedia 5.0
ApplicationWindow {
title: qsTr("Hello World")
width: 640
height: 480
menuBar: MenuBar {
Menu {
title: qsTr("File")
MenuItem {
text: qsTr("Exit")
onTriggered: Qt.quit();
}
MenuItem {
text: qsTr("Capture")
onTriggered: {
camA.imageCapture.setMetadata("Description", "my comment")
camA.imageCapture.captureToLocation("/home/carlo/Pictures/x.jpg")
}
}
}
}
Camera { id : camA }
VideoOutput { source: camA }
}
and the result seems ok...

Resources