Open hyperlinks with QtWebView or ArcGIS Webview - arcgis

Ok so I have pretty simple app. It is a 3 tabbed app displaying 3 different websites using QtWebView. I have scoured the internet and cannot seem to find anything on this. I just simply need the webviewer to be able to open hyperlinks from the defined websites within the app or even in a new browser and download documents to the local device. Any ideas?
import QtQuick 2.9
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.5
import QtQuick.Controls.Material 2.3
import QtQuick.Window 2.3
import QtWebView 1.1
import ArcGIS.AppFramework 1.0
import Esri.ArcGISRuntime 100.12
import ArcGIS.AppFramework.WebView 1.0
App{
id: app
width: 421
height: 750
property bool lightTheme: true
// App color properties
readonly property color appBackgroundColor: lightTheme? "#FAFAFA":"#303030"
readonly property color appDialogColor: lightTheme? "#FFFFFF":"424242"
readonly property color appPrimaryTextColor: lightTheme? "#000000":"#FFFFFF"
readonly property color appSecondaryTextColor: Qt.darker(appPrimaryTextColor)
readonly property color primaryColor:"#3F51B5"
readonly property color accentColor: Qt.lighter(primaryColor,1.2)
readonly property color headerTextColor:"#FFFFFF"
readonly property color listViewDividerColor:"#19000000"
// App size properties
property real scaleFactor: AppFramework.displayScaleFactor
readonly property real baseFontSize: app.width<450*app.scaleFactor? 21 * scaleFactor:23 * scaleFactor
readonly property real titleFontSize: 1.1 * app.baseFontSize
readonly property real captionFontSize: 0.6 * app.baseFontSize
MainPage{
id: mainPage
anchors.fill: parent
}
ListModel{
id: tabViewModel
ListElement { name: qsTr("Main"); }
ListElement { name: qsTr("Map"); }
ListElement { name: qsTr("Content"); }
ListElement { name: qsTr("Survey"); }
}
Component{
id: page1ViewPage
Image {
width:500
height: 600
source: "./WGITRUCK.jpeg"
fillMode: Image.PreserveAspectCrop
anchors.fill: parent
z: -2
Rectangle {
id: rectangle
anchors.fill: parent
color: "#abe7f3"
opacity: 0.55
z: 0
visible: true
}
Text {
id: element7
x: 32
y: 469
text: qsTr("Survey tab contains the end of course survey.")
font.family: "Times New Roman"
anchors.leftMargin: 32
anchors.fill: parent
anchors.verticalCenter: parent.verticalCenter
font.pixelSize: 14
wrapMode: Text.WordWrap
anchors.top: parent.top
verticalAlignment: Text.AlignVCenter
anchors.bottomMargin: 225
font.bold: true
font.capitalization: Font.MixedCase
anchors.right: parent.right
anchors.rightMargin: 32
anchors.topMargin: 469
anchors.verticalCenterOffset: 4
}
Text {
id: element1
x: 145
text: qsTr("Wetland Delineation and Corps Permitting Course")
font.bold: true
font.family: "Times New Roman"
anchors.verticalCenterOffset: -173
anchors.leftMargin: 32
anchors.bottomMargin: 450
anchors.right: parent.right
anchors.rightMargin: 32
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
anchors.top: parent.top
anchors.topMargin: 292
anchors.verticalCenter: parent.verticalCenter
anchors.fill: parent
font.pixelSize: 20
wrapMode: Text.WordWrap
}
Text {
id: element2
x: 143
y: 9
text: qsTr("Map tab contains interactive web map containing natural resource background data such as National Wetland Inventory, NRCS Soils, USACE District Boundaries, etc.")
font.family: "Times New Roman"
font.bold: true
wrapMode: Text.WordWrap
font.capitalization: Font.MixedCase
verticalAlignment: Text.AlignVCenter
font.pixelSize: 14
anchors.rightMargin: 32
anchors.bottomMargin: 375
anchors.verticalCenterOffset: -121
anchors.top: parent.top
anchors.fill: parent
anchors.verticalCenter: parent.verticalCenter
anchors.leftMargin: 32
anchors.topMargin: 344
anchors.right: parent.right
}
Text {
id: element3
x: 139
y: 18
text: qsTr("Content tab contains all course documentation and supplemental information used for wetland delieations.")
font.family: "Times New Roman"
anchors.leftMargin: 32
anchors.fill: parent
anchors.verticalCenter: parent.verticalCenter
font.pixelSize: 14
wrapMode: Text.WordWrap
anchors.top: parent.top
verticalAlignment: Text.AlignVCenter
anchors.bottomMargin: 287
font.bold: true
font.capitalization: Font.MixedCase
anchors.right: parent.right
anchors.rightMargin: 32
anchors.topMargin: 407
anchors.verticalCenterOffset: -58
}
Text {
id: element4
x: 118
y: 239
text: qsTr("Whitenton Group")
verticalAlignment: Text.AlignVCenter
font.pixelSize: 40
anchors.bottomMargin: 457
anchors.rightMargin: 118
horizontalAlignment: Text.AlignHCenter
anchors.fill: parent
anchors.leftMargin: 118
font.bold: true
anchors.topMargin: 180
}
}
}
Component {
id: page2ViewPage
WebView {
anchors.fill: parent
url: "https://wgi.maps.arcgis.com/apps/instant/media/index.html?appid=63dcff653262471083ac035b111f678d"
}
}
Component {
id: page3ViewPage
WebView {
anchors.fill: parent
url: "https://whitenton.egnyte.com/fl/nce2a5kdoq"
}
}
Component{
id: page4ViewPage
WebView {
anchors.fill: parent
url: "https://arcg.is/1TPfrK"
}
}
MainPage {
id: mainPage1
x: 6
y: 1
anchors.rightMargin: 0
anchors.bottomMargin: 0
anchors.leftMargin: 0
anchors.topMargin: 0
anchors.fill: parent
}
}

Related

transferring the same images logic to another file

Is it possible to transfer the same code logic in another page, in which these two images are taken as alias or something similar and they behave in the same pattern of "if statement" logic on the other QML file(2) when this button is pressed from the first QML file(1)?
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Studio.Components 1.0
import QtQuick.Timeline 1.0
Item {
id: root
width: 500
height: 500
property alias locking: locking
Text {
id: confirmSign
text: qsTr("")
anchors.left: parent.left
anchors.top: parent.top
font.styleName: "Bold"
anchors.leftMargin: 70
anchors.topMargin: 55
color: "white"
font.pointSize: 10
font.family: "Tahoma"
}
RoundButton {
id: locking
y: 70
width: 90
height: 90
anchors.left: password_field.right
anchors.leftMargin: 15
Image {
id: unlck
anchors.centerIn: parent
source: "Images/Unlocked.png"
visible: false
}
Image {
id: lcked
anchors.centerIn: parent
source: "Images/Locked.png"
visible: true
}
onClicked: {
passBlocker.visible = true
confirmSign.text = qsTr("The ToolBar is 'Locked' ");
confirmSign.color = "#ffffff";
lcked.visible = true
unlck.visible = false
}
}
}
You can create a new file just for the lock image and use it wherever you want.
Something like this:
File LockImage.qml
Item {
property bool locked: false
Image {
id: lcked
anchors.centerIn: parent
source: locked? "Images/Locked.png": "Images/Unlocked.png"
visible: true
}
}
Side note: you don’t need to change properties using clicked handler. Prefer using the checked property of Button

Error when customizing Controls 2 SpinBox

When customizing a QtQuickControls2 SpinBox, I get this error in the console when closing my application :
"There are still \"2\" items in the process of being created at engine destruction."
The number varies depending on how many Spinboxes are in the windows, it goes up for every indicator that was customized (two times per customized SpinBox : one for the up indicator, one for the down indicator). I tried commenting out each part of my custom code, as well as using the example code provided here, so I am positive that this is where the error comes from.
Does anyone know how to get rid of this error ?
Main window code :
import QtQuick 2.7
import QtQuick.Controls 2.3
ApplicationWindow{
width: 1600
height: 900
visible: true
SpinBox_custom{
}
}
Custom SpinBox_custom code :
import QtQuick 2.11
import QtQuick.Controls 2.4
SpinBox {
id: control
value: 50
editable: true
contentItem: TextInput {
anchors.fill: parent
anchors.rightMargin : up.indicator.width
anchors.leftMargin : down.indicator.width
z: 2
text: control.textFromValue(control.value, control.locale)
font.pointSize: Style.textPointSize-2
color: '#7e8d9e'
selectionColor: '#7e8d9e'
selectedTextColor: "white"
horizontalAlignment: Qt.AlignHCenter
verticalAlignment: Qt.AlignVCenter
readOnly: !control.editable
validator: control.validator
inputMethodHints: Qt.ImhFormattedNumbersOnly
}
up.indicator: Rectangle {
x: control.mirrored ? 0 : parent.width - width
height: parent.height
implicitWidth: 20
implicitHeight: 30
color: control.up.pressed ? '#dee2e6' : '#bec6ce'
border.color: enabled ? '#bec6ce' : '#dee2e6'
Text {
text: "+"
font.pixelSize: control.font.pixelSize * 2
color: '#428AC9'
anchors.fill: parent
fontSizeMode: Text.Fit
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
}
}
down.indicator: Rectangle {
x: control.mirrored ? parent.width - width : 0
height: parent.height
implicitWidth: 20
implicitHeight: 30
color: control.down.pressed ? '#dee2e6' : '#bec6ce'
border.color: enabled ? '#bec6ce' : '#dee2e6'
Text {
text: "-"
font.pixelSize: control.font.pixelSize * 2
color: '#428AC9'
anchors.fill: parent
fontSizeMode: Text.Fit
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
}
}
background: Rectangle {
implicitWidth: 90
}
}
I've just faced the same problem and after some experiments seemed to find that it's somewhat connected to assigning literal values to the value property of SpinBox.
Something similar is also discussed in this report, and these are other things asking for trouble when used in SpinBox mentioned there:
references between internal elements of SpinBox (contentItem, background, [up,down].indicator's)
references to parent in internal elements
assigning id to internal elements
After getting rid of all of that and also changing value: 0 to value: from it automagically stopped warning me with the message in the original post.
Just as a reference, here's the snippet which works for me without the warning:
SpinBox
{
id: control
value: from
from: 0
to: 600
editable: true
enabled: true
leftPadding: topPadding
rightPadding: height
contentItem: Item
{
anchors.left: control.left
anchors.top: control.top
anchors.bottom: control.bottom
implicitWidth: input.implicitWidth
implicitHeight: input.implicitHeight
width: control.width - control.height
height: control.height
TextInput
{
id: input
anchors.fill: parent
text: control.textFromValue(control.value, control.locale)
color: "black"
horizontalAlignment: Qt.AlignHCenter
verticalAlignment: Qt.AlignVCenter
readOnly: !control.editable
validator: control.validator
inputMethodHints: Qt.ImhFormattedNumbersOnly
}
}
up.indicator: Rectangle
{
anchors.top: control.top
anchors.right: control.right
anchors.topMargin: 1
anchors.rightMargin: 1
height: control.height / 2
width: control.height
color: "gold"
}
down.indicator: Rectangle
{
anchors.bottom: control.bottom
anchors.right: control.right
anchors.bottomMargin: 1
anchors.rightMargin: 1
height: control.height / 2
width: control.height
color: "orange"
}
background: Rectangle
{
implicitWidth: 100
border.color: "red"
border.width: 1
radius: 2
}
}

QML: Center variable text and image

I need to horizonally center a variable-length text (red box) and an image (yellow box) in a big box (green box). The text shall wrap if it does not fit the box.
Existing code:
Item {
id: bigBox
x: 255
y: 0
width: 800
height: 100
Image {
id: imageBox
source: "image.png"
width: 52
height: 46
anchors.left: parent.left
anchors.leftMargin: 12
anchors.verticalCenter: parent.verticalCenter
horizontalAlignment: Image.AlignLeft
verticalAlignment: Image.AlignVCenter
fillMode: Image.Pad
}
Text {
id: textBox
anchors.left: symbol.right
anchors.leftMargin: 12
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
text: qsTr("heading text")
font.pixelSize: 36
font.bold: true
horizontalAlignment: Text.AlignCenter
}
}
Update:
Actual running code and a real screenshot showing the problem:
import QtQuick 2.0
Rectangle {
id: mask
x: 0
y: 0
width: 800
height: 430
color: "#FFFFFF"
property int pageState: 0
Rectangle {
x: 0
y: 0
width: 111
height: 100
color: "#0000FF"
}
Item {
id: whitespace
x: 117
y: 0
width: 800-x
height: 100
Row {
anchors.centerIn: parent
Image {
id: symbol
source: "../img/pepper.png"
width: 52
height: 46
anchors.verticalCenter: parent.verticalCenter
fillMode: Image.Pad
}
Text {
id: heading
property var texts: ["Active Blabla","Active Blaaaaaaah Blaaaah ","Active Blabla and Blaaaaaaah Blaaaah"]
anchors.verticalCenter: parent.verticalCenter
color: "#333191"
text: texts[pageState]
font.family: "Liberation Sans"
font.pixelSize: 36
font.bold: true
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
textFormat: Text.PlainText
width: Math.min(150,contentWidth)
}
}
}
Rectangle {
id: stage
x: 0
y: 106
width: parent.width
height: parent.height-y
color: "#FFFF00"
}
Timer {
interval: 1000 // milliseconds
triggeredOnStart: true
repeat: true
running: true
onTriggered: {
pageState=(pageState+1)%3;
}
}
}
The white area top right is the green box in the first picture. The timer simply runs through the three texts, like the real application would do.
Changing the first parameter of Math.min() to 600 does not change anything.
My set of hacks to solve that problem:
Item {
// ...
Text {
function escapeHTML(text)
{
return text.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""");
}
function toHTML(imageUrl,text)
{
var textlines=escapeHTML(text).replace(/\r?\n/,"\n").split("\n");
var retval="<center>";
retval=retval+'<table><tr>';
if (imageUrl!="") {
retval=retval+'<td rowspan="'+(textlines.length)+'"><img src="'+imageUrl+'"></td>';
retval=retval+'<td rowspan="'+(textlines.length)+'"> </td>';
}
for (var i=0; i<textlines.length; i++) {
if (i>0) {
retval=retval+"<tr>";
}
retval=retval+'<td>'+textlines[i]+'</td></tr>';
}
retval=retval+'</table>';
retval=retval+"</center>";
return retval;
}
anchors.fill: parent
verticalAlignment: Text.AlignVCenter
textFormat: Text.RichText
text: toHtml("../img/pepper.png",qsTr("heading"))
}
}
<center> centers the text in the available space, but not the image
(it stays left - bug!).
<table> can be centered by <center>, and it can contain the
image.
Wrapping does not work as expected, so the translated text returned
by qsTr() has to contain linebreaks at the right positions.
toHTML() splits at the linebreaks and generates table rows from that.
The image needs a table cell with rowspan, or else the image is placed too high relative to the text.
And finally, verticalAlignment: Text.AlignVCenter places all of that vertically centered -- except for the table borders that I luckily don't need. (If you are bored, add border=1 to the <table> tag.)
And no, the HTML and CSS subset supported by Text.RichText does not support vertical alignment. The rendering engine behaves like ancient browsers, you have to stack hacks and workarounds as if it was still 1996.
import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Layouts 1.2
Item {
id: bigBox
width: 800
height: 100
Row {
anchors.centerIn: parent
Image {
anchors.verticalCenter: parent.verticalCenter
source: "blue.png"
}
Text {
anchors.verticalCenter: parent.verticalCenter
// maximum width of the text
width: Math.min(150, contentWidth)
text: qsTr("heading")
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignHCenter
}
}
}

RowLayout ignores Layout.minimumWidth

The text and text2 should be properly elided (show three dots when space is not enough to cover whole string) when the window is too small. The Layout.preferredWidth is set to be text.implicitWidth with some addition for padding, but i even set the Layout.minimumWidth, so the text can be ellided when the space is not enough. It seems that the RowLayout is ignoring the Layout.minimumWidth and keeps the Layout.preferredWidth, so the text has still width of Layout.preferredWidth and is never elided. What's wrong?
import QtQuick 2.5
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.1
ApplicationWindow {
id: window
visible: true
width: 640
height: 480
title: qsTr("Hello World")
contentItem.minimumWidth: 50
RowLayout {
id: ntoolbarline
anchors.fill: parent
Rectangle {
color: "red"
Layout.preferredWidth: text.implicitWidth + 40
Layout.preferredHeight: 25
Layout.minimumWidth: 25
Layout.minimumHeight: 25
Layout.maximumWidth: text.implicitWidth + 40
Text {
id: text
anchors.centerIn: parent
text: "Foooooooo"
elide: Text.ElideRight
width: parent.width - 40
renderType: Text.NativeRendering
}
}
Rectangle {
color: "red"
Layout.preferredWidth: text2.implicitWidth + 40
Layout.preferredHeight: 25
Layout.minimumWidth: 25
Layout.minimumHeight: 25
Layout.maximumWidth: text2.implicitWidth + 40
onWidthChanged: console.log("layout item width: " + width) // only one output when app started
Text {
id: text2
anchors.centerIn: parent
text: "Baaaaaaaar"
elide: Text.ElideRight
width: parent.width - 40
renderType: Text.NativeRendering
}
}
Item {
id: spacer
Layout.fillWidth: true
onWidthChanged: console.log("spacer width: " + width) // outputs whenever the window is resized
}
}
}
You have two main problems here:
fillWidth is not defined
Text is centerIn the parent Rectangle
Without 1. the Rectangles cannot grow or shrink inside the desired constraints. By making use of 2. the Text element as no specific constraints on its size and borders and thus Text cannot correctly check that an elide is required. The correct way to go is to use fill and setting alignments via the verticalAlignment and horizontalAlignment of Text.
The final revisited code looks like the following:
import QtQuick 2.5
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.1
ApplicationWindow {
id: window
visible: true
width: 640
height: 480
minimumWidth: 50
title: qsTr("Hello World")
RowLayout {
id: ntoolbarline
anchors.fill: parent
Rectangle {
color: "red"
Layout.fillWidth: true
Layout.preferredWidth: text.implicitWidth + 40
Layout.preferredHeight: 25
Layout.minimumWidth: 25
Layout.maximumWidth: text.implicitWidth + 40
Text {
id: text
anchors.fill: parent
text: "Foooooooo"
elide: Text.ElideRight
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
renderType: Text.NativeRendering
}
}
Rectangle {
color: "red"
Layout.fillWidth: true
Layout.preferredWidth: text.implicitWidth + 40
Layout.preferredHeight: 25
Layout.minimumWidth: 25
Layout.maximumWidth: text.implicitWidth + 40
Text {
id: text2
anchors.fill: parent
text: "Baaaaaaaar"
elide: Text.ElideRight
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
renderType: Text.NativeRendering
}
}
Item {
id: spacer
Layout.fillWidth: true
}
}
}

QML Row element refuses to work

I know I should be using Row, Column etc. rather than items anchored by ID to make my code simpler and easier to read. But they refuse to work most of the time. For example, in this case:
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Layouts 1.1
ListView {
id: listView
anchors.fill: parent
topMargin: spacing
anchors.leftMargin: spacing
anchors.rightMargin: spacing
clip: true
spacing: 0.5 * pxPermm
model: SqlQueryModel {}
delegate: Rectangle {
id: delegateItem
color: "white"
height: 14 * pxPermm
width: listView.width
clip: true
Row {
id: row
anchors.fill: delegateItem
spacing: pxPermm
Image {
height: row.height
width: height
source: "qrc:/resources/ryba.jpg"
fillMode: Image.PreserveAspectCrop
}
Item {
id: textItem
height: row.height
Label {
anchors.left: textItem.left
anchors.top: textItem.top
text: nazov
font.bold: true
}
Label {
anchors.left: textItem.left
anchors.bottom: textItem.bottom
text: cas
}
}
}
}
}
This shows two Labels on the top of an Image in the delegate of list view. Not two labels to the right of the image, as you would expect. However, this code works:
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Layouts 1.1
ListView {
id: listView
anchors.fill: parent
topMargin: spacing
anchors.leftMargin: spacing
anchors.rightMargin: spacing
clip: true
spacing: 0.5 * pxPermm
model: SqlQueryModel {}
delegate: Rectangle {
id: delegateItem
color: "white"
height: 14 * pxPermm
width: listView.width
clip: true
Row {
id: row
anchors.fill: delegateItem
spacing: pxPermm
Image {
height: row.height
width: height
source: "qrc:/resources/ryba.jpg"
fillMode: Image.PreserveAspectCrop
}
Label {
text: nazov
font.bold: true
}
}
}
}
Of course I need to show more than one label in the delegate. What am I missing here?
It turns out that Item has zero width by default. The code works properly after the width is set:
Item {
id: textItem
height: row.height
width: childrenRect.width
// labels etc
}