From 36173e25ff767498e8bedbc67bef5d9ea880423f Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 26 Jun 2015 14:40:35 +0200 Subject: [PATCH] Doc: add UI Forms tutorial Based on the Qt Quick Controls UI Forms example. Change-Id: Iec42b7559161f980e4f482c63bfc40a22f5e77f8 Reviewed-by: Tim Jenssen --- doc/config/qtcreator-project.qdocconf | 1 + .../uiforms/CustomerModelSingleton.qml | 130 +++++ doc/examples/uiforms/CustomerTableView.qml | 68 +++ doc/examples/uiforms/History.qml | 73 +++ doc/examples/uiforms/HistoryTableView.qml | 72 +++ doc/examples/uiforms/MainForm.ui.qml | 86 +++ doc/examples/uiforms/Notes.qml | 74 +++ doc/examples/uiforms/NotesForm.ui.qml | 93 ++++ doc/examples/uiforms/Settings.qml | 86 +++ doc/examples/uiforms/SettingsForm.ui.qml | 152 ++++++ doc/examples/uiforms/deployment.pri | 27 + doc/examples/uiforms/main.cpp | 56 ++ doc/examples/uiforms/main.qml | 130 +++++ doc/examples/uiforms/qml.qrc | 14 + doc/examples/uiforms/uiforms.pro | 15 + ...ldesigner-uiforms-example-about-dialog.png | Bin 0 -> 6137 bytes .../qmldesigner-uiforms-example-main-view.png | Bin 0 -> 28577 bytes ...ldesigner-uiforms-example-settings-tab.png | Bin 0 -> 24326 bytes doc/images/qmldesigner-uiforms-example.png | Bin 0 -> 13441 bytes .../qmldesigner-uiforms-reset-height.png | Bin 0 -> 3095 bytes doc/src/overview/creator-tutorials.qdoc | 8 + .../projects/creator-projects-overview.qdoc | 2 +- doc/src/qtcreator.qdoc | 1 + .../qtquick/creator-mobile-app-tutorial.qdoc | 2 +- doc/src/qtquick/qtquick-app-tutorial.qdoc | 3 + doc/src/qtquick/qtquick-uiforms-tutorial.qdoc | 516 ++++++++++++++++++ 26 files changed, 1607 insertions(+), 2 deletions(-) create mode 100644 doc/examples/uiforms/CustomerModelSingleton.qml create mode 100644 doc/examples/uiforms/CustomerTableView.qml create mode 100644 doc/examples/uiforms/History.qml create mode 100644 doc/examples/uiforms/HistoryTableView.qml create mode 100644 doc/examples/uiforms/MainForm.ui.qml create mode 100644 doc/examples/uiforms/Notes.qml create mode 100644 doc/examples/uiforms/NotesForm.ui.qml create mode 100644 doc/examples/uiforms/Settings.qml create mode 100644 doc/examples/uiforms/SettingsForm.ui.qml create mode 100644 doc/examples/uiforms/deployment.pri create mode 100644 doc/examples/uiforms/main.cpp create mode 100644 doc/examples/uiforms/main.qml create mode 100644 doc/examples/uiforms/qml.qrc create mode 100644 doc/examples/uiforms/uiforms.pro create mode 100644 doc/images/qmldesigner-uiforms-example-about-dialog.png create mode 100644 doc/images/qmldesigner-uiforms-example-main-view.png create mode 100644 doc/images/qmldesigner-uiforms-example-settings-tab.png create mode 100644 doc/images/qmldesigner-uiforms-example.png create mode 100644 doc/images/qmldesigner-uiforms-reset-height.png create mode 100644 doc/src/qtquick/qtquick-uiforms-tutorial.qdoc diff --git a/doc/config/qtcreator-project.qdocconf b/doc/config/qtcreator-project.qdocconf index 598bd327358..fbe1054e0df 100644 --- a/doc/config/qtcreator-project.qdocconf +++ b/doc/config/qtcreator-project.qdocconf @@ -7,6 +7,7 @@ sourcedirs = $SRCDIR/src imagedirs = $SRCDIR/images $SRCDIR/templates/images outputdir = $OUTDIR exampledirs = $SRCDIR/examples +examples.fileextensions += *.qml HTML.extraimages = images/commercial.png qhp.QtCreator.extraFiles = images/commercial.png diff --git a/doc/examples/uiforms/CustomerModelSingleton.qml b/doc/examples/uiforms/CustomerModelSingleton.qml new file mode 100644 index 00000000000..1a80ea083e8 --- /dev/null +++ b/doc/examples/uiforms/CustomerModelSingleton.qml @@ -0,0 +1,130 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +pragma Singleton + +import QtQuick 2.0 + +ListModel { + property QtObject selection + ListElement { + customerId: "15881123" + firstName: "Julia" + title: "Ms." + lastName: "Jefferson" + email: "Julia@example.com" + address: "Spandia Avenue, Suite 610" + city: "Toronto" + zipCode: "92334" + phoneNumber: "0803-033330" + notes: "Very demanding customer." + history: "21.4.2014|Order|coffee~23.4.2014|Order|poster~29.4.2014|Invoice|poster 40$~05.5.2014|Overdue Notice|poster 40$" + } + + ListElement { + customerId: "29993496" + firstName: "Tim" + lastName: "Northington" + title: "Mr." + email: "Northington@example.com" + address: "North Fifth Street 55" + city: "San Jose" + zipCode: "95112" + phoneNumber: "09000-3330" + notes: "Very good customer." + history: "18.4.2014|Order|orange juice~23.4.2014|Order|chair~24.4.2014|Complaint|Chair is broken." + } + + ListElement { + customerId: "37713567" + firstName: "Daniel" + lastName: "Krumm" + title: "Mr." + email: "Krumm@example.com" + address: "Waterfront 14" + city: "Berlin" + zipCode: "12334" + phoneNumber: "0708093330" + notes: "This customer has a lot of Complaints." + history: "15.4.2014|Order|table~25.4.2014|Return|table~28.4.2014|Complaint|Table had wrong color." + } + + ListElement { + customerId: "45817387" + firstName: "Sandra" + lastName: "Booth" + title: "Ms." + email: "Sandrab@example.com" + address: "Folsom Street 23" + city: "San Francisco" + zipCode: "94103" + phoneNumber: "0103436370" + notes: "This customer is not paying." + history: "22.4.2014|Order|coffee~23.4.2014|Order|smartphone~29.4.2014|Invoice|smartphone 200$~05.5.2014|Overdue Notice|smartphone 200$" + } + + ListElement { + customerId: "588902396" + firstName: "Lora" + lastName: "Beckner" + title: "Ms." + email: "LoraB@example.com" + address: " W Wilson Apt 3" + city: "Los Angeles" + zipCode: "90086" + phoneNumber: "0903436360" + notes: "This customer usually pays late." + history: "17.4.2014|Order|soft drink~23.4.2014|Order|computer~29.4.2014|Invoice|computer 1200$~07.5.2014|Overdue Notice|computer 1200$" + } + + ListElement { + customerId: "78885693" + firstName: "Vanessa" + lastName: "Newbury" + title: "Ms." + email: "VanessaN@example.com" + address: "Madison Ave. 277" + city: "New York" + zipCode: "10016" + phoneNumber: "0503053530" + notes: "Deliveries sometime do not arrive on time." + history: "19.4.2014|Order|coffee~23.4.2014|Order|bicycle~29.4.2014|Invoice|bicycle 500$~06.5.2014|Overdue Notice|bicycle 500$" + } +} diff --git a/doc/examples/uiforms/CustomerTableView.qml b/doc/examples/uiforms/CustomerTableView.qml new file mode 100644 index 00000000000..a938fc59ebf --- /dev/null +++ b/doc/examples/uiforms/CustomerTableView.qml @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 1.3 +import QtQuick.Layouts 1.1 + +TableView { + id: tableView + + property int columnWidth: width / 3 - 1 + Layout.minimumWidth: splitView1.width * 2 / 5 + + TableViewColumn { + role: "customerId" + title: qsTr("Customer Id") + width: tableView.columnWidth + } + + TableViewColumn { + role: "firstName" + title: qsTr("First Name") + width: tableView.columnWidth + } + + TableViewColumn { + role: "lastName" + title: qsTr("Last Name") + width: tableView.columnWidth + } +} diff --git a/doc/examples/uiforms/History.qml b/doc/examples/uiforms/History.qml new file mode 100644 index 00000000000..dfa1bfc0724 --- /dev/null +++ b/doc/examples/uiforms/History.qml @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.4 +import my.customermodel.singleton 1.0 + +HistoryTableView { + + function readData() { + CustomerModel.selection.forEach(function (rowIndex) { + + var history = CustomerModel.get(rowIndex).history + var entries = history.split("~") + + model.clear() + + var index + for (index = 0; index < entries.length; index++) { + var entry = entries[index] + var data = entry.split("|") + model.append({ + date: data[0], + type: data[1], + text: data[2] + }) + } + }) + } + + Connections { + target: CustomerModel.selection + onSelectionChanged: readData() + } + + Component.onCompleted: readData() +} diff --git a/doc/examples/uiforms/HistoryTableView.qml b/doc/examples/uiforms/HistoryTableView.qml new file mode 100644 index 00000000000..4a33087f3f6 --- /dev/null +++ b/doc/examples/uiforms/HistoryTableView.qml @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 1.3 +import QtQuick.Layouts 1.1 + +TableView { + id: tableView + + property int columnWidth: width / 3 + + anchors.fill: parent + + TableViewColumn { + role: "date" + title: qsTr("Date") + width: tableView.columnWidth + } + + TableViewColumn { + role: "type" + title: qsTr("Type") + width: tableView.columnWidth + } + + TableViewColumn { + role: "text" + title: qsTr("Description") + width: tableView.columnWidth + } + + model: ListModel { + } +} diff --git a/doc/examples/uiforms/MainForm.ui.qml b/doc/examples/uiforms/MainForm.ui.qml new file mode 100644 index 00000000000..d0beed79871 --- /dev/null +++ b/doc/examples/uiforms/MainForm.ui.qml @@ -0,0 +1,86 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 1.2 +import QtQuick.Layouts 1.1 + +Item { + property alias tableView1: tableView1 + + SplitView { + id: splitView1 + anchors.fill: parent + + CustomerTableView { + id: tableView1 + } + + TabView { + id: tabView1 + width: 360 + height: 300 + + Tab { + id: tab1 + source: "Settings.qml" + title: "Customer Settings" + } + + Tab { + id: tab2 + x: -3 + y: 5 + source: "Notes.qml" + title: "Customer Notes" + } + + Tab { + id: tab3 + x: -7 + y: -7 + source: "History.qml" + title: "Customer History" + } + } + } + +} + diff --git a/doc/examples/uiforms/Notes.qml b/doc/examples/uiforms/Notes.qml new file mode 100644 index 00000000000..be6a5d75ec5 --- /dev/null +++ b/doc/examples/uiforms/Notes.qml @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.4 +import my.customermodel.singleton 1.0 + +NotesForm { + id: form + + function readData() { + CustomerModel.selection.forEach(function (rowIndex) { + form.textArea1.text = CustomerModel.get(rowIndex).notes + }) + + save.enabled = true + cancel.enabled = true + form.textArea1.enabled = true + } + + function writeData() { + CustomerModel.selection.forEach(function (rowIndex) { + var data = CustomerModel.get(rowIndex) + data.notes = form.textArea1.text + CustomerModel.set(rowIndex, data) + }) + } + + cancel.onClicked: readData() + save.onClicked: writeData() + + Connections { + target: CustomerModel.selection + onSelectionChanged: form.readData() + } + + Component.onCompleted: readData() +} diff --git a/doc/examples/uiforms/NotesForm.ui.qml b/doc/examples/uiforms/NotesForm.ui.qml new file mode 100644 index 00000000000..edbde598a92 --- /dev/null +++ b/doc/examples/uiforms/NotesForm.ui.qml @@ -0,0 +1,93 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Layouts 1.0 +import QtQuick.Controls 1.2 + +Item { + id: content + width: 400 + height: 400 + property alias textArea1: textArea1 + property alias cancel: cancel + property alias save: save + + ColumnLayout { + id: columnLayout1 + height: 100 + anchors.right: parent.right + anchors.rightMargin: 12 + anchors.left: parent.left + anchors.leftMargin: 12 + anchors.top: parent.top + anchors.topMargin: 12 + + TextArea { + id: textArea1 + Layout.fillHeight: true + Layout.fillWidth: true + } + } + + RowLayout { + id: rowLayout1 + width: 100 + anchors.right: parent.right + anchors.rightMargin: 12 + anchors.bottom: parent.bottom + anchors.bottomMargin: 12 + + Button { + id: save + text: qsTr("Save") + Layout.fillHeight: true + Layout.fillWidth: true + } + + Button { + id: cancel + text: qsTr("Cancel") + Layout.fillHeight: true + Layout.fillWidth: true + } + } +} + diff --git a/doc/examples/uiforms/Settings.qml b/doc/examples/uiforms/Settings.qml new file mode 100644 index 00000000000..a0b70e161ea --- /dev/null +++ b/doc/examples/uiforms/Settings.qml @@ -0,0 +1,86 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.4 +import my.customermodel.singleton 1.0 + +SettingsForm { + id: form + anchors.fill: parent + + function readData() { + + form.title.model = ["Mr.", "Ms."] + + CustomerModel.selection.forEach(function (rowIndex) { + form.firstName.text = CustomerModel.get(rowIndex).firstName + form.lastName.text = CustomerModel.get(rowIndex).lastName + form.customerId.text = CustomerModel.get(rowIndex).customerId + form.title.currentIndex = form.title.find(CustomerModel.get(rowIndex).title) + }) + + save.enabled = true + cancel.enabled = true + gridLayout1.enabled = true + } + + function writeData() { + CustomerModel.selection.forEach(function (rowIndex) { + var notes = CustomerModel.get(rowIndex).notes + CustomerModel.set(rowIndex, { + firstName: form.firstName.text, + lastName: form.lastName.text, + customerId: form.customerId.text, + title: form.title.currentText, + notes: notes + }) + }) + } + + cancel.onClicked: readData() + save.onClicked: writeData() + + Connections { + target: CustomerModel.selection + onSelectionChanged: form.readData() + } + + Component.onCompleted: readData() +} diff --git a/doc/examples/uiforms/SettingsForm.ui.qml b/doc/examples/uiforms/SettingsForm.ui.qml new file mode 100644 index 00000000000..5a86c8c7fd1 --- /dev/null +++ b/doc/examples/uiforms/SettingsForm.ui.qml @@ -0,0 +1,152 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 1.2 +import QtQuick.Layouts 1.0 + +Item { + id: content + + property alias customerId: customerId + property alias lastName: lastName + property alias firstName: firstName + property alias gridLayout1: gridLayout1 + property alias rowLayout1: rowLayout1 + + property alias save: save + property alias cancel: cancel + property alias title: title + + GridLayout { + id: gridLayout1 + rows: 4 + columns: 3 + rowSpacing: 8 + columnSpacing: 8 + anchors.right: parent.right + anchors.rightMargin: 12 + anchors.left: parent.left + anchors.leftMargin: 12 + anchors.top: parent.top + anchors.topMargin: 12 + + Label { + id: label1 + text: qsTr("Title") + } + + Label { + id: label2 + text: qsTr("First Name") + } + + Label { + id: label3 + text: qsTr("Last Name") + } + + + ComboBox { + id: title + } + + + TextField { + id: firstName + text: "" + Layout.fillHeight: true + Layout.fillWidth: true + placeholderText: qsTr("First Name") + } + + + + TextField { + id: lastName + Layout.fillHeight: true + Layout.fillWidth: true + placeholderText: qsTr("Last Name") + } + + + + + Label { + id: label4 + text: qsTr("Customer Id") + Layout.fillWidth: true + Layout.fillHeight: true + } + + TextField { + id: customerId + width: 0 + height: 0 + Layout.fillHeight: true + Layout.fillWidth: true + Layout.columnSpan: 3 + placeholderText: qsTr("Customer Id") + } + } + + RowLayout { + id: rowLayout1 + anchors.right: parent.right + anchors.rightMargin: 12 + anchors.bottom: parent.bottom + anchors.bottomMargin: 12 + + Button { + id: save + text: qsTr("Save") + Layout.fillHeight: true + Layout.fillWidth: true + } + + Button { + id: cancel + text: qsTr("Cancel") + Layout.fillHeight: true + Layout.fillWidth: true + } + } +} + diff --git a/doc/examples/uiforms/deployment.pri b/doc/examples/uiforms/deployment.pri new file mode 100644 index 00000000000..5441b63dc85 --- /dev/null +++ b/doc/examples/uiforms/deployment.pri @@ -0,0 +1,27 @@ +android-no-sdk { + target.path = /data/user/qt + export(target.path) + INSTALLS += target +} else:android { + x86 { + target.path = /libs/x86 + } else: armeabi-v7a { + target.path = /libs/armeabi-v7a + } else { + target.path = /libs/armeabi + } + export(target.path) + INSTALLS += target +} else:unix { + isEmpty(target.path) { + qnx { + target.path = /tmp/$${TARGET}/bin + } else { + target.path = /opt/$${TARGET}/bin + } + export(target.path) + } + INSTALLS += target +} + +export(INSTALLS) diff --git a/doc/examples/uiforms/main.cpp b/doc/examples/uiforms/main.cpp new file mode 100644 index 00000000000..86f9268177b --- /dev/null +++ b/doc/examples/uiforms/main.cpp @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + QUrl resourceUrl(QStringLiteral("qrc:/CustomerModelSingleton.qml")); + qmlRegisterSingletonType(resourceUrl, "my.customermodel.singleton", 1, 0, "CustomerModel"); + + QQmlApplicationEngine engine; + engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); + + return app.exec(); +} diff --git a/doc/examples/uiforms/main.qml b/doc/examples/uiforms/main.qml new file mode 100644 index 00000000000..0d6830d5e51 --- /dev/null +++ b/doc/examples/uiforms/main.qml @@ -0,0 +1,130 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 1.2 +import QtQuick.Dialogs 1.2 +import QtQuick.Layouts 1.1 +import my.customermodel.singleton 1.0 + +ApplicationWindow { + visible: true + width: 640 + height: 480 + title: qsTr("Qt Quick UI Forms") + + menuBar: MenuBar { + Menu { + title: qsTr("&File") + MenuItem { + text: qsTr("E&xit") + onTriggered: Qt.quit(); + } + } + Menu { + title: qsTr("&Edit") + MenuItem { + action: cutAction + } + MenuItem { + action: copyAction + } + MenuItem { + action: pasteAction + } + } + Menu { + title: qsTr("&Help") + MenuItem { + text: qsTr("About...") + onTriggered: aboutDialog.open() + } + } + } + + Action { + id: copyAction + text: qsTr("&Copy") + shortcut: StandardKey.Copy + iconName: "edit-copy" + enabled: (!!activeFocusItem && !!activeFocusItem["copy"]) + onTriggered: activeFocusItem.copy() + } + + Action { + id: cutAction + text: qsTr("Cu&t") + shortcut: StandardKey.Cut + iconName: "edit-cut" + enabled: (!!activeFocusItem && !!activeFocusItem["cut"]) + onTriggered: activeFocusItem.cut() + } + + Action { + id: pasteAction + text: qsTr("&Paste") + shortcut: StandardKey.Paste + iconName: "edit-paste" + enabled: (!!activeFocusItem && !!activeFocusItem["paste"]) + onTriggered: activeFocusItem.paste() + } + + MainForm { + anchors.fill: parent + Layout.minimumWidth: 800 + Layout.minimumHeight: 480 + Layout.preferredWidth: 768 + Layout.preferredHeight: 480 + tableView1.model: CustomerModel + + Component.onCompleted: CustomerModel.selection = tableView1.selection + } + + MessageDialog { + id: aboutDialog + icon: StandardIcon.Information + title: qsTr("About") + text: "Qt Quick UI Forms" + informativeText: qsTr("This example demonstrates how to separate the " + + "implementation of an application from the UI " + + "using ui.qml files.") + } +} + diff --git a/doc/examples/uiforms/qml.qrc b/doc/examples/uiforms/qml.qrc new file mode 100644 index 00000000000..a459cec0380 --- /dev/null +++ b/doc/examples/uiforms/qml.qrc @@ -0,0 +1,14 @@ + + + main.qml + MainForm.ui.qml + CustomerModelSingleton.qml + Settings.qml + SettingsForm.ui.qml + Notes.qml + NotesForm.ui.qml + History.qml + HistoryTableView.qml + CustomerTableView.qml + + diff --git a/doc/examples/uiforms/uiforms.pro b/doc/examples/uiforms/uiforms.pro new file mode 100644 index 00000000000..d11099c2b53 --- /dev/null +++ b/doc/examples/uiforms/uiforms.pro @@ -0,0 +1,15 @@ +TEMPLATE = app + +QT += qml quick widgets + +SOURCES += main.cpp + +RESOURCES += qml.qrc + +# Additional import path used to resolve QML modules in Qt Creator's code model +QML_IMPORT_PATH = + +# Default rules for deployment. +include(deployment.pri) + +DISTFILES += diff --git a/doc/images/qmldesigner-uiforms-example-about-dialog.png b/doc/images/qmldesigner-uiforms-example-about-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..0cf6e33210ca928a69464eb9b43ecdfe6f86bf6b GIT binary patch literal 6137 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 literal 0 HcmV?d00001 diff --git a/doc/images/qmldesigner-uiforms-example-main-view.png b/doc/images/qmldesigner-uiforms-example-main-view.png new file mode 100644 index 0000000000000000000000000000000000000000..099611c10fe367d7ac8de67d98ac8528539e4286 GIT binary patch literal 28577 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 VDgJcn77J+mil?ie%Q~loCIB4M=OF+9 literal 0 HcmV?d00001 diff --git a/doc/images/qmldesigner-uiforms-reset-height.png b/doc/images/qmldesigner-uiforms-reset-height.png new file mode 100644 index 0000000000000000000000000000000000000000..99d748a72db1447dfdf26ece0c73f1c3478389f2 GIT binary patch literal 3095 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 U`68vuz`(%Z>FVdQ&MBb@0LJPoM*si- literal 0 HcmV?d00001 diff --git a/doc/src/overview/creator-tutorials.qdoc b/doc/src/overview/creator-tutorials.qdoc index e14391bf8c3..26c3817aee9 100644 --- a/doc/src/overview/creator-tutorials.qdoc +++ b/doc/src/overview/creator-tutorials.qdoc @@ -51,6 +51,14 @@ Learn how to create a Qt Quick application using Qt Quick Controls for Android and iOS devices. + \li \l{Using Qt Quick UI Forms} + + Learn how to develop a Qt Quick application by using UI forms. + UI forms are split into \e .qml and \e .js files that contain the + business logic, and \e .ui.qml files that only contain the purely + declarative description of the UI. Note that some of the described + features are only available in the commercial version of \QC. + \endlist */ diff --git a/doc/src/projects/creator-projects-overview.qdoc b/doc/src/projects/creator-projects-overview.qdoc index 013243fccca..e7751703dbf 100644 --- a/doc/src/projects/creator-projects-overview.qdoc +++ b/doc/src/projects/creator-projects-overview.qdoc @@ -24,7 +24,7 @@ /*! \contentspage {Qt Creator Manual} - \previouspage creator-mobile-app-tutorial.html + \previouspage {Using Qt Quick UI Forms} \page creator-project-managing.html \nextpage creator-project-creating.html diff --git a/doc/src/qtcreator.qdoc b/doc/src/qtcreator.qdoc index 9b2c51c174c..d1917e537e6 100644 --- a/doc/src/qtcreator.qdoc +++ b/doc/src/qtcreator.qdoc @@ -139,6 +139,7 @@ \li \l{Creating a Qt Quick Application} \li \l{Creating a Qt Widget Based Application} \li \l{Creating a Mobile Application} + \li \l{Using Qt Quick UI Forms} \endlist \endlist \li \l{Managing Projects} diff --git a/doc/src/qtquick/creator-mobile-app-tutorial.qdoc b/doc/src/qtquick/creator-mobile-app-tutorial.qdoc index 56f84210f8b..27c1fc60cd5 100644 --- a/doc/src/qtquick/creator-mobile-app-tutorial.qdoc +++ b/doc/src/qtquick/creator-mobile-app-tutorial.qdoc @@ -26,7 +26,7 @@ \contentspage {Qt Creator Manual} \previouspage creator-writing-program.html \page creator-mobile-app-tutorial.html - \nextpage creator-project-managing.html + \nextpage {Using Qt Quick UI Forms} \title Creating a Mobile Application diff --git a/doc/src/qtquick/qtquick-app-tutorial.qdoc b/doc/src/qtquick/qtquick-app-tutorial.qdoc index 204ce69bdae..919eade1af7 100644 --- a/doc/src/qtquick/qtquick-app-tutorial.qdoc +++ b/doc/src/qtquick/qtquick-app-tutorial.qdoc @@ -43,6 +43,9 @@ For more information about using \QMLD, see \l{Developing Qt Quick Applications}. + For tutorials that describe using Qt Quick Controls, see + \l{Qt Quick Text Editor Guide} and \l{Qt Quick Controls - UI Forms}. + \section1 Creating the Project \list 1 diff --git a/doc/src/qtquick/qtquick-uiforms-tutorial.qdoc b/doc/src/qtquick/qtquick-uiforms-tutorial.qdoc new file mode 100644 index 00000000000..3736777ddb3 --- /dev/null +++ b/doc/src/qtquick/qtquick-uiforms-tutorial.qdoc @@ -0,0 +1,516 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing +** +** This file is part of Qt Creator +** +** +** GNU Free Documentation License +** +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of this +** file. +** +** +****************************************************************************/ +/*! + \contentspage {Qt Creator Manual} + \previouspage creator-mobile-app-tutorial.html + \example uiforms + \nextpage creator-project-managing.html + + \title Using Qt Quick UI Forms + + \commercial + + This tutorial describes how to develop an application that uses \e ui.qml + files to separate the application logic from the UI. The tutorial uses \QMLD + to implement a simplified version of the \l{Qt Quick Controls - UI Forms} + {UI Forms example}, which provides an interface to a customer database and + is purely written in QML and JavaScript. + + \note Some of the described features are only available in the commercial + version of \QC. + + \image qmldesigner-uiforms-example.png + + \e {UI forms} consist of \e .qml and \e .js files that implement the + business logic, and corresponding \e .ui.qml files that only contain the + purely declarative description of the UI. The \e .ui.qml files should be + edited only in the \uicontrol Design mode of \QC. However, \QMLD does not + fully support all QML controls, such as the TableView, so you sometimes need + to edit UI forms also in the \uicontrol Edit mode. You can keep this to the + minimum by creating custom QML types that you edit in the \uicontrol Edit + mode. + + \section1 Creating the UI Forms Project + + \list 1 + + \li Select \uicontrol File > \uicontrol {New File or Project} > + \uicontrol Application > \uicontrol {Qt Quick Controls Application} + > \uicontrol Choose. + + \li In the \uicontrol Name field, type \b uiforms. + + \li In the \uicontrol {Create in} field, enter the path for the project + files and then click \uicontrol Next (or \uicontrol Continue on + OS X). + + \li In the \uicontrol {Minimal required Qt version} field, select + \uicontrol {Qt 5.4}, or later. + + \li Select \l{glossary-buildandrun-kit}{kits} for your project and click + \uicontrol{Next}. + + \note Kits are listed if they have been specified in + \uicontrol Tools > \uicontrol Options > \uicontrol {Build & Run} > + \uicontrol Kits (on Windows and Linux) or in \uicontrol {Qt Creator} + > \uicontrol Preferences \uicontrol {Build & Run} > \uicontrol Kits + (on OS X). + + \li Review the project settings, and click \uicontrol Finish (or + \uicontrol Done on OS X). + + \endlist + + \QC generates a default UI file, \e MainForm.ui.qml, that you can modify to + create the main view of the application. + + \section1 Creating the UI Forms Main View + + The main view of the application displays a customer list in a table view + and detailed information about the selected customer in a tab view. + + \image qmldesigner-uiforms-example-main-view.png + + To create the main view: + + \list 1 + + \li In the \uicontrol Projects view (1), double-click the + \e MainForm.ui.qml file to open it in \QMLD. + + \li In the \uicontrol Navigator (2), select the \uicontrol RowLayout and + press \key Delete to delete it. + + \li In \uicontrol Library > \uicontrol {QML Types} (3), select + \uicontrol SplitView and drag and drop it to the \uicontrol Item in + the navigator. + + \li Select the split view in the navigator, then select the + \uicontrol Layout tab in \uicontrol Properties (4), and then click + the \inlineimage qmldesigner-anchor-fill-screen.png + (\uicontrol {Fill to Parent}) button to anchor the split view to the + item. + + \li Drag and drop a \uicontrol TableView and a \uicontrol {Tab View} + from the library to the split view in the navigator. + + \li Select the \inlineimage qmldesigner-export-item-button.png + (\uicontrol Export) button in the navigator to export the table view + as a property. + + \li Right-click \uicontrol TabView to open the context menu and select + \uicontrol {Add Tab} to create a Tab element. + + \QC creates the element as a separate QML file with the name that + you enter in the dialog. By default, the element is called + \uicontrol Tab. + + \li Select the tab in the navigator and enter \b {Customer Settings} in + the \uicontrol Title field in the properties. + + \li Press \key Ctrl+C to copy the tab to the clipboard, and then press + \key Ctrl+V twice to create two more tabs that you name + \b {Customer Notes} and \b {Customer History}. \QC uses the \l Tab + type in the \e MainForm.ui.qml file. You will create separate UI + forms for the tab contents later. + + \endlist + + \section2 Editing the Table View + + \QMLD does not support adding columns to TableView types, and therefore, you + must use the code editor to add them. To keep editing the \e MainForm.ui.qml + file in the \uicontrol Edit mode to the minimum, move the TableView type to + a separate QML file called \e CustomerTableView.qml: + + \list 1 + + \li Click \uicontrol Edit to open \e MainForm.ui.qml in \uicontrol Edit + mode. + + \li To move the TableView type to a separate QML file, right-click it + and select \uicontrol Refactoring > + \uicontrol {Move Component into Separate File}. + + \li Add the code from the \l {uiforms/CustomerTableView.qml} + {CustomerTableView.qml} example file to the file that \QC creates + for you. + + \endlist + + \section1 Implementing the Application Logic for the Main View + + The new project wizard adds boilerplate code to the \e main.qml file to + create menu items and push buttons. Modify the boilerplate code by removing + obsolete code and by adding new code. You removed the push buttons from the + UI Form, so you also need to remove the corresponding code from + \e main.qml (or the application cannot be built). + + You will want to keep the dialog box and menu bar, but change their + contents, as instructed later. + + Edit the \e main.qml file in the code editor, as described in the following + sections. + + \section2 Specifying Main View Size + + The wizard creates an ApplicationWindow type and a MainForm type that + specify the application main view. Enter the application name as the + value of the \c title property. + + Clean up the MainForm code by removing the obsolete lines that call + functions when buttons are clicked: + + \badcode + MainForm { + anchors.fill: parent + button1.onClicked: messageDialog.show(qsTr("Button 1 pressed")) + button2.onClicked: messageDialog.show(qsTr("Button 2 pressed")) + } + \endcode + + Remove the \c width and \c height properties from the ApplicationWindow + type and use a Layout type in the MainForm type to set the minimum and + preferred size of the main view. + + To use the Layouts, import QtQuick Layouts: + + \quotefromfile uiforms/main.qml + \skipto QtQuick.Layouts + \printline Layouts + + Then specify the following properties for the MainForm: + + \skipto MainForm + \printuntil Layout.preferredHeight + + \section2 Creating the Table View Model + + Use a list model to display customer data in the table view. Because the + list model is accessed from several different \e .qml files, access it + through a singleton type defined in \e CustomerModelSingleton.qml and + registered in \e main.cpp. This way, you do not have to rely on the QML + context scoping rules to access the list model. + + \list 1 + + \li In the \uicontrol Projects view, right-click \uicontrol qml.qrc and + select \uicontrol {Add New} > \uicontrol Qt > + \uicontrol {QML File (Qt Quick 2)} to create the + \e CustomerModelSingleton.qml file and to add it to the project. + + \li Copy the implementation from \l{uiforms/CustomerModelSingleton.qml} + {CustomerModelSingleton.qml}. + + \li Add the following code to the MainForm in \e main.qml to access the + list model: + + \quotefromfile uiforms/main.qml + \skipto tableView1.model: CustomerModel + \printuntil tableView1.selection + + \li To register the singleton type in the \e main.cpp file, include the + Qt QML module and call the \c qmlRegisterSingletonType() function in + the initialization function: + + \quotefromfile uiforms/main.cpp + \dots + \skipto QtQml + \printuntil "CustomerModel"); + + \li To use the registered singleton type in \e main.qml, you must import + the singleton type: + + \quotefromfile uiforms/main.qml + \skipto my.customermodel.singleton + \printline 1.0 + + \endlist + + \section1 Creating Tabs + + You can use the new file wizard to create UI forms that specify tab + contents and functionality. You set the QML files as sources for the tabs + in the \e MainForm.ui.qml file and modify the corresponding UI forms in the + \uicontrol Design mode. + + \section2 Creating UI Forms for Tab Contents + + To create UI forms for the tab contents: + + \list 1 + + \li Select \uicontrol File > \uicontrol {New File or Project} > + \uicontrol Qt > \uicontrol {QtQuick UI File} > \uicontrol Choose. + + \li In the \uicontrol {Component name} field, enter \b Settings. + + \li Click \uicontrol Next. + + \li Click \uicontrol Finish to create the UI form, + \e SettingsForm.ui.qml, and a corresponding QML file, + \e Settings.qml. + + \endlist + + Create the UI form, \e NotesForm.ui.qml, and the corresponding QML file, + \e Notes.qml, for the notes tab in the same way. You will not need an + \e ui.qml file for the history tab, so you will create the QML file for it + later. + + \section2 Creating the Settings Tab + + The \uicontrol {Customer Settings} tab contains information about the + selected user. + + \image qmldesigner-uiforms-example-settings-tab.png + + To create the tab contents: + + \list 1 + + \li Double-click \e SettingsForm.ui.qml in the \uicontrol Projects + view to open it for editing in the \uicontrol Design mode. + + \li Select \uicontrol Item in the \uicontrol Navigator and enter + \b content in the \uicontrol Id field in \uicontrol Properties. + + \li In \uicontrol Library, select \uicontrol Imports > + \uicontrol {Add Import} and import Qt Quick Controls and Layouts to + make the QML types in those modules visible in the library. + + \li Drag and drop a \uicontrol {Grid Layout} from the library to the + \b content item in the navigator. + + \li Select \uicontrol Layout > \uicontrol Top, \uicontrol Left, and + \uicontrol Right buttons to anchor the grid layout to the parent. + + \li In the \uicontrol Margin fields for the anchors, set the margins + to \b 12. + + \li In \uicontrol Properties, set \uicontrol {Column spacing} and + \uicontrol {Row spacing} to \b 8, \uicontrol Columns to \b 3, and + \uicontrol Rows to \b 4. If you add more fields, add the necessary + amount of rows. + + \li Drag and drop four \uicontrol Label controls, a + \uicontrol {Combo Box}, and three \uicontrol {Text Field} controls + from the library to the navigator. + + \li Use the down arrow in the navigator to move one label down to the + position above the last text field. + + \li In the properties, change the label text for each field in the + \uicontrol Text field. You need the following labels: \b Title, + \b {First Name}, \b {Last Name}, and \b {Customer Id}. + + \li In the properties, change the placeholder text for each text field + in the \uicontrol {Placeholder text} field to be the same as the + field label. + + \li Select the customer ID text field, then select \uicontrol Layout + in properties and set \uicontrol {Column span} to 3 and check + \uicontrol {Fill width} to make the ID field span the length of + the grid layout. + + \li Drag and drop a \uicontrol {Row Layout} from the library to the + \b content item in the navigator and click on it. + + \li Reset the height of the row layout in properties. + + \image qmldesigner-uiforms-reset-height.png + + \li Select \uicontrol Layout > \uicontrol Bottom and \uicontrol Right + buttons to anchor the row layout to the parent. + + \li In the \uicontrol Margin fields for the anchors, set the margins + to \b 12. + + \li Drag and drop two \uicontrol Button controls from the library to the + row layout in the navigator. + + \li In the properties, change the button labels in the \uicontrol Text + field to \b Save and \b Cancel. + + \li Select \uicontrol Layout and > \uicontrol {Fill width} and + \uicontrol {Fill height} in properties for each button to have the + buttons fill the row layout. + + \li In the navigator, select \uicontrol Export for each field to export + the field IDs as properties. The following items should be exported, + so that they can be referred to in \e Settings.qml: + + \quotefromfile uiforms/SettingsForm.ui.qml + \skipto property + \printuntil title + + \endlist + + \section2 Creating the Notes Tab + + The \uicontrol {Customer Notes} tab contains a text area for entering notes + about the selected customer and buttons for saving or canceling the changes. + + To create the tab contents: + + \list 1 + + \li Double-click \e NotesForm.ui.qml in the \uicontrol Projects + view to open it for editing in the \uicontrol Design mode. + + \li Select \uicontrol Item in the \uicontrol Navigator and enter + \b content in the \uicontrol Id field in \uicontrol Properties. + + \li In \uicontrol Library, select \uicontrol Imports > + \uicontrol {Add Import} and import Qt Quick Controls and Layouts. + + \li Drag and drop a \uicontrol {Column Layout} from the library to the + \b content item in the navigator. + + \li Select \uicontrol Layout > \uicontrol Top, \uicontrol Left, and + \uicontrol Right buttons to anchor the grid layout to the parent + and set the margins to \b 12. + + \li Drag and drop a \uicontrol {Text Area} from the library to the + column layout. + + \li Select \uicontrol Layout and > \uicontrol {Fill width} and + \uicontrol {Fill height} in properties to have the text area fill + the column layout. + + \li Create the \uicontrol Save and \uicontrol Cancel buttons as + instructed in \l {Creating the Settings Tab}. You can also copy and + paste the row layout from SettingsForm.ui.qml. + + \li In the navigator, select \uicontrol Export for each field to export + the field IDs as properties. The following items should be exported, + so that they can be referred to in \e Notes.qml: + + \quotefromfile uiforms/NotesForm.ui.qml + \skipto property + \printuntil save + + \endlist + + \section2 Creating the History Tab + + The \uicontrol {Customer History} tab contains a table view that displays + the transactions performed by the customer. Create a custom HistoryTableView + type that you can edit in the \uicontrol Edit mode. For the history tab, you + do not need an \e ui.qml file at all. + + To create the history tab: + + \list 1 + + \li In the \uicontrol Projects view, right-click \uicontrol qml.qrc and + select \uicontrol {Add New} > \uicontrol Qt > + \uicontrol {QML File (Qt Quick 2)} to create the + \e HistoryTableView.qml file and to add it to the project. + + \li Copy the implementation from \l{uiforms/HistoryTableView.qml} + {HistoryTableView.qml}. + + \li Add the code from the example \l{uiforms/History.qml}{History.qml} + file to your \e History.qml file to access the code model. + + \endlist + + \section1 Adding Tab Functionality + + Add functions for displaying data from the customer model in the tabs. You + have already created the files that you need. You now need to copy the + implementation for the settings tab from the \l {uiforms/Settings.qml} + {Settings.qml} file and for the notes tab from the \l {uiforms/Notes.qml} + {Notes.qml} file. + + To display the tab contents in the main view, set the QML files as sources + for the tabs in the \uicontrol Design mode. Select the settings tab in the + \uicontrol Navigator and specify for example \e Settings.qml in the + \uicontrol Source field in the \uicontrol Properties view. Similarly, + specify the sources for the notes and history tabs. + + You can then remove the \e Tab.qml file that the wizard generated but that + you no longer need by selecting \uicontrol {Remove File} in the context + menu. + + \section1 Creating Menus + + The wizard adds a menu bar to the \e main.qml file that contains a + \uicontrol File menu with the \uicontrol Open and \uicontrol Exit menu + items. Keep the menu and the \uicontrol Exit menu item, and add the + \uicontrol Edit and \uicontrol Help menus with standard menu items. + + The wizard creates the following code: + + \badcode + menuBar: MenuBar { + Menu { + title: qsTr("&File") + MenuItem { + text: qsTr("&Open") + onTriggered: messageDialog.show(qsTr("Open action triggered")); + } + MenuItem { + text: qsTr("E&xit") + onTriggered: Qt.quit(); + } + } + } + \endcode + + Remove the \uicontrol Open menu item and add the following code to create + the new menus: + + \quotefromfile uiforms/main.qml + \skipto menuBar + \printuntil activeFocusItem.paste + \printuntil } + + \section1 Creating Dialogs + + \image qmldesigner-uiforms-example-about-dialog.png + + The wizard creates a message box in the \e main.qml file that you should + turn into an \uicontrol About dialog for the purpose of this example: + + \badcode + MessageDialog { + id: messageDialog + title: qsTr("May I have your attention, please?") + + function show(caption) { + messageDialog.text = caption; + messageDialog.open(); + } + \endcode + + Modify the code created by the wizard to add an icon and some text: + + \quotefromfile uiforms/main.qml + \skipto MessageDialog + \printuntil } + + Enable access to the \uicontrol About dialog from the \uicontrol Help menu + that you create next. + + \section1 Running the Application + + The application is complete and ready to be run on the desktop or deployed + to a device. To run the application, press \key {Ctrl+R}. +*/