Merge "Merge remote-tracking branch 'origin/4.12'"
@@ -1,2 +1,10 @@
|
|||||||
These forms are processed at run-time to produce dynamically-generated user interfaces. In order to generate a form at run-time, a resource file containing a .ui file is needed. Applications that use the form handling classes need to be configured to be built against the QtUiTools module. This is done by including the following declaration in a qmake project file to ensure that the application is compiled and linked appropriately. A form loader object, provided by the QUiLoader class, is used to construct the user interface. This user interface
|
IDE Overview
|
||||||
can be retrieved from any QIODevice; for example, a QFile object can be used to obtain a form stored in a project's resources. The QUiLoader::load() function takes the user interface description contained in the file and constructs the form widget.
|
|
||||||
|
Qt Creator is an integrated development environment (IDE) that provides you
|
||||||
|
with tools to design and develop applications with the Qt application framework.
|
||||||
|
Qt is designed for developing applications and user interfaces once and
|
||||||
|
deploying them to several desktop, embedded, and mobile operating systems or web
|
||||||
|
browsers (experimental). Qt Creator provides you with tools for accomplishing
|
||||||
|
your tasks throughout the whole application development life-cycle, from
|
||||||
|
creating a project to deploying the application to the target platforms.
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 17 KiB |
BIN
doc/qtcreator/images/qtcreator-git-log.png
Normal file
After Width: | Height: | Size: 9.3 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 8.5 KiB |
After Width: | Height: | Size: 7.5 KiB |
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 8.1 KiB After Width: | Height: | Size: 12 KiB |
BIN
doc/qtcreator/images/qtcreator-textfinder-filter.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 8.2 KiB |
After Width: | Height: | Size: 8.4 KiB |
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 8.2 KiB |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 9.0 KiB |
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 16 KiB |
@@ -76,6 +76,25 @@
|
|||||||
To switch to the editor context when you close the last help page, select
|
To switch to the editor context when you close the last help page, select
|
||||||
the \uicontrol {Return to editor on closing the last page} check box.
|
the \uicontrol {Return to editor on closing the last page} check box.
|
||||||
|
|
||||||
|
\section1 Selecting the Help Viewer Backend
|
||||||
|
|
||||||
|
The help viewer backend determines the style sheet that is used to display
|
||||||
|
the help files. A help viewer backend that is based on the \l {QTextBrowser}
|
||||||
|
is used by default. However, it has several issues that have been fixed when
|
||||||
|
using litehtml as the help viewer backend.
|
||||||
|
|
||||||
|
On \macos, you can also use a help viewer backend that is based on the
|
||||||
|
system WebView component.
|
||||||
|
|
||||||
|
To switch the help viewer backend:
|
||||||
|
|
||||||
|
\list 1
|
||||||
|
\li Select \uicontrol Tools > \uicontrol Options > \uicontrol Help >
|
||||||
|
\uicontrol General.
|
||||||
|
\li In the \uicontrol {Viewer backend} field, select a viewer backend.
|
||||||
|
\li Reload the help page to take the new backend to use.
|
||||||
|
\endlist
|
||||||
|
|
||||||
\section1 Viewing Function Tooltips
|
\section1 Viewing Function Tooltips
|
||||||
|
|
||||||
To hide function tooltips by default, select \uicontrol Tools >
|
To hide function tooltips by default, select \uicontrol Tools >
|
||||||
|
@@ -121,11 +121,5 @@
|
|||||||
\endtable
|
\endtable
|
||||||
|
|
||||||
* See \l{Running on QNX Devices} for limitations.
|
* See \l{Running on QNX Devices} for limitations.
|
||||||
|
|
||||||
\note Madde support has been removed from \QC 3.0. To develop for Maemo or Harmattan,
|
|
||||||
use \QC 2.8.
|
|
||||||
|
|
||||||
\note BlackBerry 10 support has been removed from \QC 3.5. Use \QC 3.4 instead.
|
|
||||||
|
|
||||||
//! [target platforms]
|
//! [target platforms]
|
||||||
*/
|
*/
|
||||||
|
@@ -101,25 +101,24 @@
|
|||||||
|
|
||||||
\section1 Example of Adding Internal Libraries
|
\section1 Example of Adding Internal Libraries
|
||||||
|
|
||||||
The following example describes how to add a statically linked internal
|
To add an internal library to your project:
|
||||||
library to your project.
|
|
||||||
|
|
||||||
\list 1
|
\list 1
|
||||||
|
|
||||||
\li Choose \uicontrol File > \uicontrol {New File or Project} >
|
\li Select \uicontrol File > \uicontrol {New File or Project} >
|
||||||
\uicontrol Library > \uicontrol {C++ Library} to create the library.
|
\uicontrol Library > \uicontrol {C++ Library}.
|
||||||
|
|
||||||
The \uicontrol {Introduction and Product Location} dialog opens.
|
\li Select \uicontrol Choose to open the \uicontrol {Project Location}
|
||||||
|
dialog.
|
||||||
|
|
||||||
\image qtcreator-add-library-wizard-ex-1.png "Introduction and Product Location dialog"
|
\image qtcreator-add-library-wizard-ex-1.png "Project Location dialog"
|
||||||
|
|
||||||
\li In the \uicontrol Type field, select \uicontrol {Statically Linked Library}.
|
|
||||||
|
|
||||||
\li In the \uicontrol Name field, give a name for the library. For example,
|
\li In the \uicontrol Name field, give a name for the library. For example,
|
||||||
\b mylib.
|
\b mylib.
|
||||||
|
|
||||||
\li Follow the instructions of the wizard until you get to the
|
\li Follow the instructions of the wizard until you get to the
|
||||||
\uicontrol {Project Management} dialog. In the \uicontrol {Add to project}
|
\uicontrol {Project Management} dialog. In the
|
||||||
|
\uicontrol {Add as a subproject to project}
|
||||||
list, select a project. For example, \b myapp.
|
list, select a project. For example, \b myapp.
|
||||||
|
|
||||||
\li In the \uicontrol Projects view, right-click the project name to open the
|
\li In the \uicontrol Projects view, right-click the project name to open the
|
||||||
@@ -127,9 +126,10 @@
|
|||||||
\uicontrol {Add Library} > \uicontrol {Internal Library} >
|
\uicontrol {Add Library} > \uicontrol {Internal Library} >
|
||||||
\uicontrol Next.
|
\uicontrol Next.
|
||||||
|
|
||||||
\li In the \uicontrol Library field, select \b mylib and click \uicontrol Next.
|
\li In the \uicontrol Library field, select \b mylib, and then select
|
||||||
|
\uicontrol Next.
|
||||||
|
|
||||||
\li Click \uicontrol Finish to add the following library declaration to the
|
\li Select \uicontrol Finish to add the following library declaration to the
|
||||||
project file:
|
project file:
|
||||||
|
|
||||||
\code
|
\code
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
**
|
**
|
||||||
** Copyright (C) 2019 The Qt Company Ltd.
|
** Copyright (C) 2020 The Qt Company Ltd.
|
||||||
** Contact: https://www.qt.io/licensing/
|
** Contact: https://www.qt.io/licensing/
|
||||||
**
|
**
|
||||||
** This file is part of the Qt Creator documentation.
|
** This file is part of the Qt Creator documentation.
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
to enter the information. If you created the project by using another \QC
|
to enter the information. If you created the project by using another \QC
|
||||||
instance, \QC asks whether you want to use the old settings. The settings
|
instance, \QC asks whether you want to use the old settings. The settings
|
||||||
are specific to the development environment, and should not be copied from
|
are specific to the development environment, and should not be copied from
|
||||||
one environment to another. Therefore, we recommend that you click \uicontrol No
|
one environment to another. Therefore, we recommend that you select \uicontrol No
|
||||||
and enter the information again in the \uicontrol {Configure Project} tab.
|
and enter the information again in the \uicontrol {Configure Project} tab.
|
||||||
|
|
||||||
The \uicontrol {Configure Project} tab displays a list of \l{glossary-buildandrun-kit}{kits}
|
The \uicontrol {Configure Project} tab displays a list of \l{glossary-buildandrun-kit}{kits}
|
||||||
@@ -86,8 +86,10 @@
|
|||||||
(CMake), \e {.qbs} (Qbs), \e {pyproject} (Python), or
|
(CMake), \e {.qbs} (Qbs), \e {pyproject} (Python), or
|
||||||
\e {Makefile.am} (Autotools, experimental).
|
\e {Makefile.am} (Autotools, experimental).
|
||||||
|
|
||||||
\li In the \uicontrol {Configure Project} tab, select kits for building and running your
|
\li In the \uicontrol {Configure Project} tab, select kits for building
|
||||||
project, and click \uicontrol {Configure Project}.
|
and running your project.
|
||||||
|
|
||||||
|
\li Select \uicontrol {Configure Project}.
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
@@ -96,16 +98,16 @@
|
|||||||
|
|
||||||
\list
|
\list
|
||||||
|
|
||||||
\li In all modes, select \key Ctrl+O (\key Cmd+O on \macos) to open the
|
\li In all modes, press \key Ctrl+O (\key Cmd+O on \macos) to open the
|
||||||
\uicontrol {Open File} dialog, where you can select a project file
|
\uicontrol {Open File} dialog, where you can select a project file
|
||||||
to open a project.
|
to open a project.
|
||||||
|
|
||||||
\li In all modes, except the \uicontrol Help mode, select
|
\li In all modes, except the \uicontrol Help mode, press
|
||||||
\key Ctrl+Shift+O (\key Cmd+Shift+O on \macos) to open the
|
\key Ctrl+Shift+O (\key Cmd+Shift+O on \macos) to open the
|
||||||
\uicontrol {Load Project} dialog, where you can select a project
|
\uicontrol {Load Project} dialog, where you can select a project
|
||||||
file to open a project.
|
file to open a project.
|
||||||
|
|
||||||
\li In the \uicontrol Welcome mode, \uicontrol Projects tab, select
|
\li In the \uicontrol Welcome mode, \uicontrol Projects tab, press
|
||||||
\key Ctrl+Shift+number (\key Cmd+Shift+number on \macos), where
|
\key Ctrl+Shift+number (\key Cmd+Shift+number on \macos), where
|
||||||
the number is the number of a project in the list of recently opened
|
the number is the number of a project in the list of recently opened
|
||||||
projects.
|
projects.
|
||||||
|
@@ -50,7 +50,8 @@
|
|||||||
To set up a project, you first have to decide what kind of an
|
To set up a project, you first have to decide what kind of an
|
||||||
application you want to develop: do you want a user interface based
|
application you want to develop: do you want a user interface based
|
||||||
on Qt Quick or Qt widgets. Second, you have to choose the
|
on Qt Quick or Qt widgets. Second, you have to choose the
|
||||||
language to implement the application logic: C++ or JavaScript.
|
language to implement the application logic: C++, JavaScript, or
|
||||||
|
Python.
|
||||||
|
|
||||||
\li \l{Using Version Control Systems}
|
\li \l{Using Version Control Systems}
|
||||||
|
|
||||||
|
@@ -32,36 +32,47 @@
|
|||||||
|
|
||||||
\li Select \uicontrol File > \uicontrol {New File or Project} >
|
\li Select \uicontrol File > \uicontrol {New File or Project} >
|
||||||
\uicontrol {Application (Qt Quick)} >
|
\uicontrol {Application (Qt Quick)} >
|
||||||
\uicontrol {Qt Quick Application - Swipe} > \uicontrol Choose.
|
\uicontrol {Qt Quick Application - Swipe}.
|
||||||
|
|
||||||
|
\li Select \uicontrol Choose to open the
|
||||||
|
\uicontrol {Project Location} dialog.
|
||||||
|
|
||||||
\li In the \uicontrol Name field, enter a name for the application.
|
\li In the \uicontrol Name field, enter a name for the application.
|
||||||
|
|
||||||
\li In the \uicontrol {Create in} field, enter the path for the project
|
\li In the \uicontrol {Create in} field, enter the path for the project
|
||||||
files, and then select \uicontrol Next (or \uicontrol Continue on
|
files.
|
||||||
\macos).
|
|
||||||
|
\li Select \uicontrol Next (or \uicontrol Continue on \macos) to open
|
||||||
|
the \uicontrol {Define Build System} dialog.
|
||||||
|
|
||||||
\li In the \uicontrol {Build system} field, select the build system to
|
\li In the \uicontrol {Build system} field, select the build system to
|
||||||
use for building and running the project: \l qmake,
|
use for building and running the project: \l qmake,
|
||||||
\l {Setting Up CMake}{CMake}, or \l {Setting Up Qbs}{Qbs}.
|
\l {Setting Up CMake}{CMake}, or \l {Setting Up Qbs}{Qbs}.
|
||||||
|
|
||||||
\li In the \uicontrol {Qt Quick Controls Style} field, select one of
|
\li Select \uicontrol Next to open the
|
||||||
the predefined \l{Styling Qt Quick Controls}{UI styles} to use,
|
\uicontrol {Define Project Details} dialog.
|
||||||
and then select \uicontrol Next.
|
|
||||||
|
\li Select \uicontrol Next to use the default settings and to open
|
||||||
|
the \uicontrol {Translation File} dialog.
|
||||||
|
|
||||||
|
\li Select \uicontrol Next to use the default settings and to open
|
||||||
|
the \uicontrol {Kit Selection} dialog.
|
||||||
|
|
||||||
\li Select \l{glossary-buildandrun-kit}{kits} for the platforms that
|
\li Select \l{glossary-buildandrun-kit}{kits} for the platforms that
|
||||||
you want to build the application for. To build applications for
|
you want to build the application for. To build applications for
|
||||||
mobile devices, select kits for Android ARM and iPhone OS, and
|
mobile devices, select kits for Android ARM and iPhone OS.
|
||||||
click \uicontrol{Next}.
|
|
||||||
|
|
||||||
\note Kits are listed if they have been specified in \uicontrol
|
\note Kits are listed if they have been specified in \uicontrol
|
||||||
Tools > \uicontrol Options > \uicontrol Kits (on Windows and Linux)
|
Tools > \uicontrol Options > \uicontrol Kits (on Windows and Linux)
|
||||||
or in \uicontrol {\QC} > \uicontrol Preferences >
|
or in \uicontrol {\QC} > \uicontrol Preferences >
|
||||||
\uicontrol Kits (on \macos).
|
\uicontrol Kits (on \macos).
|
||||||
|
For more information, see \l {Adding Kits}.
|
||||||
|
|
||||||
\li Select \uicontrol Next.
|
\li Select \uicontrol Next to open the \uicontrol {Project Management}
|
||||||
|
dialog.
|
||||||
|
|
||||||
\li Review the project settings, and click \uicontrol{Finish} (or
|
\li Review the project settings, and select \uicontrol{Finish}
|
||||||
\uicontrol Done on \macos).
|
(or \uicontrol Done on \macos) to create the project.
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
@@ -71,5 +82,8 @@
|
|||||||
in the \uicontrol {Text Editor} to add the application logic. For the
|
in the \uicontrol {Text Editor} to add the application logic. For the
|
||||||
purposes of this example, you can ignore \e Page2Form.ui.qml.
|
purposes of this example, you can ignore \e Page2Form.ui.qml.
|
||||||
|
|
||||||
|
For more information about the settings that you skipped, see
|
||||||
|
\l{Creating Qt Quick Applications}.
|
||||||
|
|
||||||
//! [qt quick application]
|
//! [qt quick application]
|
||||||
*/
|
*/
|
||||||
|
@@ -100,30 +100,44 @@
|
|||||||
\QC creates the necessary boilerplate files. Some of the files are
|
\QC creates the necessary boilerplate files. Some of the files are
|
||||||
specific to a particular target platform.
|
specific to a particular target platform.
|
||||||
|
|
||||||
\section1 Creating Empty Qt Quick Applications
|
\section1 Creating Qt Quick Applications
|
||||||
|
|
||||||
\list 1
|
\list 1
|
||||||
|
|
||||||
\li Select \uicontrol File > \uicontrol {New File or Project} >
|
\li Select \uicontrol File > \uicontrol {New File or Project} >
|
||||||
\uicontrol {Application (Qt Quick)} >
|
\uicontrol {Application (Qt Quick)}.
|
||||||
\uicontrol {Qt Quick Application - Empty} > \uicontrol Choose.
|
|
||||||
|
\li Select the application type:
|
||||||
|
\list
|
||||||
|
\li \uicontrol {Qt Quick Application - Empty}
|
||||||
|
\li \uicontrol {Qt Quick Application - Scroll}
|
||||||
|
\li \uicontrol {Qt Quick Application - Stack}
|
||||||
|
\li \uicontrol {Qt Quick Application - Swipe}
|
||||||
|
\endlist
|
||||||
|
|
||||||
|
\li Select \uicontrol Choose to open the \uicontrol {Project Location}
|
||||||
|
dialog.
|
||||||
|
|
||||||
\li In the \uicontrol Name field, enter a name for the application.
|
\li In the \uicontrol Name field, enter a name for the application.
|
||||||
|
|
||||||
\li In the \uicontrol {Create in} field, enter the path for the project
|
\li In the \uicontrol {Create in} field, enter the path for the project
|
||||||
files, and then select \uicontrol Next (or \uicontrol Continue on
|
files. Select the \uicontrol {Use as default project location} check
|
||||||
\macos).
|
box to create new projects in this folder by default.
|
||||||
|
|
||||||
|
\li Select \uicontrol Next (or \uicontrol Continue on \macos) to open
|
||||||
|
the \uicontrol {Define Build System} dialog.
|
||||||
|
|
||||||
\li In the \uicontrol {Build system} field, select the build system to
|
\li In the \uicontrol {Build system} field, select the build system to
|
||||||
use for building and running the project: \l qmake,
|
use for building and running the project: \l qmake,
|
||||||
\l {Setting Up CMake}{CMake}, or \l {Setting Up Qbs}{Qbs}.
|
\l {Setting Up CMake}{CMake}, or \l {Setting Up Qbs}{Qbs}.
|
||||||
|
|
||||||
\li Select \uicontrol Next.
|
\li Select \uicontrol Next to open the
|
||||||
|
\uicontrol {Define Project Details} dialog.
|
||||||
|
|
||||||
\li Select the Qt version to
|
\li Select the Qt version to develop with in the
|
||||||
develop with in the \uicontrol {Minimal required Qt version} field.
|
\uicontrol {Minimal required Qt version} field.
|
||||||
The Qt version determines the Qt Quick imports that are used in the
|
The Qt version determines the Qt Quick imports
|
||||||
QML files.
|
that are used in the QML files.
|
||||||
|
|
||||||
\li Select the \uicontrol {Use Qt Virtual Keyboard} check box to add
|
\li Select the \uicontrol {Use Qt Virtual Keyboard} check box to add
|
||||||
support for \l{http://doc.qt.io/qt-5/qtvirtualkeyboard-index.html}
|
support for \l{http://doc.qt.io/qt-5/qtvirtualkeyboard-index.html}
|
||||||
@@ -135,7 +149,8 @@
|
|||||||
You can use the \l {Installing Qt}{Qt Maintenance Tool} to install
|
You can use the \l {Installing Qt}{Qt Maintenance Tool} to install
|
||||||
Qt Virtual Keyboard.
|
Qt Virtual Keyboard.
|
||||||
|
|
||||||
\li Select \uicontrol Next.
|
\li Select \uicontrol Next to open the \uicontrol {Translation File}
|
||||||
|
dialog.
|
||||||
|
|
||||||
\li In the \uicontrol Language field, select a language that you plan
|
\li In the \uicontrol Language field, select a language that you plan
|
||||||
to \l {Using Qt Linguist}{translate} the application to. You can
|
to \l {Using Qt Linguist}{translate} the application to. You can
|
||||||
@@ -145,83 +160,42 @@
|
|||||||
name for the translation source file that will be generated
|
name for the translation source file that will be generated
|
||||||
for the selected language.
|
for the selected language.
|
||||||
|
|
||||||
\li Select \uicontrol Next.
|
\li Select \uicontrol Next to open the \uicontrol {Kit Selection}
|
||||||
|
dialog.
|
||||||
\li Select \l{glossary-buildandrun-kit}{kits} for running and building
|
|
||||||
your project, and then click \uicontrol Next.
|
|
||||||
|
|
||||||
\note Kits are listed if they have been specified in
|
|
||||||
\uicontrol Tools > \uicontrol Options > \uicontrol Kits.
|
|
||||||
|
|
||||||
\li Review the project settings, and click \uicontrol Finish (on Windows
|
|
||||||
and Linux) or \uicontrol Done (on \macos) to create the project.
|
|
||||||
|
|
||||||
\endlist
|
|
||||||
|
|
||||||
\QC generates a QML file, \e main.qml, that you can modify in the Design
|
|
||||||
mode.
|
|
||||||
|
|
||||||
\include creator-python-project.qdocinc python qml project wizards
|
|
||||||
|
|
||||||
\section1 Creating Qt Quick Controls Applications
|
|
||||||
|
|
||||||
\list 1
|
|
||||||
|
|
||||||
\li Select \uicontrol File > \uicontrol {New File or Project} >
|
|
||||||
\uicontrol {Application (Qt Quick)} >
|
|
||||||
\uicontrol {Qt Quick Application - Scroll},
|
|
||||||
\uicontrol {Qt Quick Application - Stack}, or
|
|
||||||
\uicontrol {Qt Quick Application - Swipe} > \uicontrol Choose.
|
|
||||||
|
|
||||||
\li In the \uicontrol Name field, enter a name for the application.
|
|
||||||
|
|
||||||
\li In the \uicontrol {Create in} field, enter the path for the project
|
|
||||||
files, and then select \uicontrol Next (or \uicontrol Continue on
|
|
||||||
\macos).
|
|
||||||
|
|
||||||
\li In the \uicontrol {Build system} field, select the build system to
|
|
||||||
use for building and running the project: \l qmake,
|
|
||||||
\l {Setting Up CMake}{CMake}, or \l {Setting Up Qbs}{Qbs}.
|
|
||||||
|
|
||||||
\li In the \uicontrol {Qt Quick Controls Style} field, select one of
|
|
||||||
the predefined \l{Styling Qt Quick Controls}{UI styles} to use,
|
|
||||||
and then select \uicontrol Next.
|
|
||||||
|
|
||||||
\li Select the \uicontrol {Use Qt Virtual Keyboard} check box to add
|
|
||||||
support for \l{http://doc.qt.io/qt-5/qtvirtualkeyboard-index.html}
|
|
||||||
{Qt Virtual Keyboard} to the application.
|
|
||||||
|
|
||||||
\note \l{http://doc.qt.io/qt-5/qtvirtualkeyboard-index.html}
|
|
||||||
{Qt Virtual Keyboard} is not supported for Android and iOS.
|
|
||||||
|
|
||||||
\li Select \l{glossary-buildandrun-kit}{kits} for the platforms that
|
\li Select \l{glossary-buildandrun-kit}{kits} for the platforms that
|
||||||
you want to build the application for. To build applications for
|
you want to build the application for.
|
||||||
mobile devices, select kits for Android ARM and iOS, and
|
|
||||||
click \uicontrol{Next}.
|
|
||||||
|
|
||||||
\note Kits are listed if they have been specified in \uicontrol
|
\note Kits are listed if they have been specified in \uicontrol
|
||||||
Tools > \uicontrol Options > \uicontrol Kits (on Windows and Linux)
|
Tools > \uicontrol Options > \uicontrol Kits (on Windows and Linux)
|
||||||
or in \uicontrol {\QC} > \uicontrol Preferences >
|
or in \uicontrol {\QC} > \uicontrol Preferences >
|
||||||
\uicontrol Kits (on \macos).
|
\uicontrol Kits (on \macos).
|
||||||
|
For more information, see \l {Adding Kits}.
|
||||||
|
|
||||||
\li Select \uicontrol Next.
|
\li Select \uicontrol Next to open the \uicontrol {Project Management}
|
||||||
|
dialog.
|
||||||
|
|
||||||
\li Review the project settings, and click \uicontrol{Finish} (or
|
\li Review the project settings, and select \uicontrol Finish
|
||||||
\uicontrol Done on \macos).
|
(on Windows and Linux) or \uicontrol Done (on \macos) to
|
||||||
|
create the project.
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
For the Scroll application, \QC creates a QML file, \e main.qml, that you
|
For the Empty and Scroll applications, \QC creates a QML file,
|
||||||
can modify in the Design mode.
|
\e main.qml, that you can modify in the \uicontrol {Form Editor}
|
||||||
|
or the \uicontrol {Text Editor}.
|
||||||
|
|
||||||
For the Stack and Swipe applications, \QC generates two UI files,
|
For the Stack and Swipe applications, \QC generates two UI files,
|
||||||
\e Page1Form.ui.qml and \e Page2Form.ui.qml, that you can modify in the
|
\e Page1Form.ui.qml and \e Page2Form.ui.qml, that you can modify in the
|
||||||
\uicontrol {Form Editor} and a QML file, \e main.qml, that you can
|
\uicontrol {Form Editor} and a QML file, \e main.qml, that you can
|
||||||
modify in the \uicontrol {Text Editor} to add the application logic.
|
modify in the \uicontrol {Text Editor} to add the application logic.
|
||||||
|
|
||||||
|
\include creator-python-project.qdocinc python qml project wizards
|
||||||
|
|
||||||
\section1 Creating Qt Quick UI Projects
|
\section1 Creating Qt Quick UI Projects
|
||||||
|
|
||||||
Qt Quick UI projects are useful for testing or prototyping user interfaces,
|
Qt Quick UI Prototype projects are useful for testing or prototyping user
|
||||||
|
interfaces,
|
||||||
or for setting up a separate project just for QML editing, for example. You
|
or for setting up a separate project just for QML editing, for example. You
|
||||||
cannot use them for application development, because they do not contain:
|
cannot use them for application development, because they do not contain:
|
||||||
|
|
||||||
@@ -232,13 +206,28 @@
|
|||||||
{devices}
|
{devices}
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
To create a Qt Quick UI project:
|
For more information about how to turn Qt Quick UI Prototype projects into
|
||||||
|
Qt Quick Application projects, see
|
||||||
|
\l{Converting UI Projects to Applications}.
|
||||||
|
|
||||||
|
To create a Qt Quick UI Prototype project:
|
||||||
|
|
||||||
\list 1
|
\list 1
|
||||||
|
|
||||||
\li Select \uicontrol File > \uicontrol {New File or Project} >
|
\li Select \uicontrol File > \uicontrol {New File or Project} >
|
||||||
\uicontrol {Other Project} > \uicontrol {Qt Quick UI Prototype} >
|
\uicontrol {Other Project} > \uicontrol {Qt Quick UI Prototype}.
|
||||||
\uicontrol Choose.
|
|
||||||
|
\li Select \uicontrol Choose to open the \uicontrol {Project Location}
|
||||||
|
dialog.
|
||||||
|
|
||||||
|
\li In the \uicontrol Name field, enter a name for the application.
|
||||||
|
|
||||||
|
\li In the \uicontrol {Create in} field, enter the path for the project
|
||||||
|
files. Select the \uicontrol {Use as default project location} check
|
||||||
|
box to create new projects in this folder by default.
|
||||||
|
|
||||||
|
\li Select \uicontrol Next (or \uicontrol Continue on \macos) to open
|
||||||
|
the \uicontrol {Define Project Details} dialog.
|
||||||
|
|
||||||
\li In the \uicontrol {Minimal required Qt version} field, select the Qt
|
\li In the \uicontrol {Minimal required Qt version} field, select the Qt
|
||||||
version to develop with. The Qt version determines the Qt Quick
|
version to develop with. The Qt version determines the Qt Quick
|
||||||
@@ -252,10 +241,30 @@
|
|||||||
support for \l{http://doc.qt.io/qt-5/qtvirtualkeyboard-index.html}
|
support for \l{http://doc.qt.io/qt-5/qtvirtualkeyboard-index.html}
|
||||||
{Qt Virtual Keyboard} to the application.
|
{Qt Virtual Keyboard} to the application.
|
||||||
|
|
||||||
\li Select \uicontrol Next (or \uicontrol Continue on \macos).
|
\note If you have not installed the Qt Virtual Keyboard module when
|
||||||
|
you installed Qt, an error message will appear when you try to open
|
||||||
|
the \e main.qml in the \uicontrol {Form Editor} in the Design mode.
|
||||||
|
You can use the \l {Installing Qt}{Qt Maintenance Tool} to install
|
||||||
|
Qt Virtual Keyboard.
|
||||||
|
|
||||||
\li Review the project settings, and click \uicontrol Finish (on Windows
|
\li Select \uicontrol Next to open the \uicontrol {Kit Selection}
|
||||||
and Linux) or \uicontrol Done (on \macos) to create the project.
|
dialog.
|
||||||
|
|
||||||
|
\li Select \l{glossary-buildandrun-kit}{kits} for the platforms that
|
||||||
|
you want to build the application for.
|
||||||
|
|
||||||
|
\note Kits are listed if they have been specified in \uicontrol
|
||||||
|
Tools > \uicontrol Options > \uicontrol Kits (on Windows and Linux)
|
||||||
|
or in \uicontrol {\QC} > \uicontrol Preferences >
|
||||||
|
\uicontrol Kits (on \macos).
|
||||||
|
For more information, see \l {Adding Kits}.
|
||||||
|
|
||||||
|
\li Select \uicontrol Next to open the \uicontrol {Project Management}
|
||||||
|
dialog.
|
||||||
|
|
||||||
|
\li Review the project settings, and select \uicontrol Finish
|
||||||
|
(on Windows and Linux) or \uicontrol Done (on \macos) to
|
||||||
|
create the project.
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
|
@@ -96,18 +96,38 @@
|
|||||||
|
|
||||||
To display the versioning history of a file, select \uicontrol{Log of}.
|
To display the versioning history of a file, select \uicontrol{Log of}.
|
||||||
The log output contains the date, the commit message, and a commit
|
The log output contains the date, the commit message, and a commit
|
||||||
identifier. Click on the commit identifier to display a description
|
identifier. Click on the commit identifier to view commit details.
|
||||||
of the change including the diff in the \uicontrol {Git Show} view.
|
|
||||||
|
|
||||||
\image qtcreator-vcs-show.png
|
\image qtcreator-git-log.png "Commit details in Git log"
|
||||||
|
|
||||||
Right-clicking on a commit identifier brings up a context menu that lets
|
Right-clicking on a commit identifier brings up a context menu that lets
|
||||||
you apply actions on the commit, such as view annotations or cherry-pick
|
you apply actions on the commit, such as view annotations or cherry-pick
|
||||||
or revert a commit.
|
or revert a commit. For more information, see \l{Working with Branches}.
|
||||||
|
|
||||||
|
To toggle the diff view, select \uicontrol Diff. To use the patience
|
||||||
|
algorithm for calculating the differences, select \uicontrol Patience.
|
||||||
|
To only show text changes, select \uicontrol {Ignore Whitespace}.
|
||||||
|
|
||||||
|
To filter log entries by the text in the commit message or by strings that
|
||||||
|
were added or removed, select \uicontrol Filter.
|
||||||
|
|
||||||
|
To follow only the first parent on merge commits, select
|
||||||
|
\uicontrol {First Parent}.
|
||||||
|
|
||||||
|
To toggle between textual and visual representation of the log, select
|
||||||
|
\uicontrol Graph.
|
||||||
|
|
||||||
|
To show log also for previous names of the file, select \uicontrol Follow.
|
||||||
|
|
||||||
Select \inlineimage reload_gray.png
|
Select \inlineimage reload_gray.png
|
||||||
(\uicontrol Reload) to rescan the files.
|
(\uicontrol Reload) to rescan the files.
|
||||||
|
|
||||||
|
To display a description of the change including the diff in the
|
||||||
|
\uicontrol {Git Show} view, select \uicontrol {Describe Change} in the
|
||||||
|
context menu.
|
||||||
|
|
||||||
|
\image qtcreator-vcs-show.png "Commit description in Git show"
|
||||||
|
|
||||||
\section2 Viewing Annotations
|
\section2 Viewing Annotations
|
||||||
|
|
||||||
To view annotations, select \uicontrol{Blame}. The view displays the lines
|
To view annotations, select \uicontrol{Blame}. The view displays the lines
|
||||||
@@ -174,7 +194,9 @@
|
|||||||
\section2 Viewing Git Status
|
\section2 Viewing Git Status
|
||||||
|
|
||||||
To view the status of the repository in the \uicontrol {Version Control}
|
To view the status of the repository in the \uicontrol {Version Control}
|
||||||
output view, select \uicontrol Status.
|
output pane, select \uicontrol Status. The context menu contains additional
|
||||||
|
actions, such as selecting and clearing all entries in the pane, copying
|
||||||
|
text, and opening files.
|
||||||
|
|
||||||
\section2 Committing Changes to Git
|
\section2 Committing Changes to Git
|
||||||
|
|
||||||
@@ -226,6 +248,13 @@
|
|||||||
\uicontrol {Interactive Rebase}. You can reorder or discard commits, squash
|
\uicontrol {Interactive Rebase}. You can reorder or discard commits, squash
|
||||||
them into a single commit, or edit the commit messages.
|
them into a single commit, or edit the commit messages.
|
||||||
|
|
||||||
|
If you already pushed the local changes to a remote, \QC refuses
|
||||||
|
the interactive rebase because the local commits are missing. To
|
||||||
|
start the interactive rebase from the change log, select
|
||||||
|
\uicontrol Branches > \uicontrol Log. Select the change, and then
|
||||||
|
select > \uicontrol {Interactive Rebase from Change} in the context
|
||||||
|
menu.
|
||||||
|
|
||||||
\section2 Working with Branches
|
\section2 Working with Branches
|
||||||
|
|
||||||
To work with Git branches, select \uicontrol {Branches}. The checked out
|
To work with Git branches, select \uicontrol {Branches}. The checked out
|
||||||
@@ -239,6 +268,10 @@
|
|||||||
(\uicontrol {Filter Tree}), and then select
|
(\uicontrol {Filter Tree}), and then select
|
||||||
\uicontrol {Include Old Entries} and \uicontrol {Include Tags}.
|
\uicontrol {Include Old Entries} and \uicontrol {Include Tags}.
|
||||||
|
|
||||||
|
To add a tag to a change in the change log, select \uicontrol Branches >
|
||||||
|
\uicontrol Log. Select the change, and then select > \uicontrol {Add Tag
|
||||||
|
for Change} in the context menu.
|
||||||
|
|
||||||
If you checked out a specific commit, the list of branches displays a
|
If you checked out a specific commit, the list of branches displays a
|
||||||
\e {Detached HEAD} entry.
|
\e {Detached HEAD} entry.
|
||||||
|
|
||||||
@@ -422,6 +455,8 @@
|
|||||||
to perform a rebase operation while pulling.
|
to perform a rebase operation while pulling.
|
||||||
|
|
||||||
To push committed changes to the remote repository, select \uicontrol Push.
|
To push committed changes to the remote repository, select \uicontrol Push.
|
||||||
|
If the local branch does not have an upstream branch in the remote
|
||||||
|
repository, \QC prompts you to create it and set it as upstream.
|
||||||
|
|
||||||
\section2 Managing Remote Repositories
|
\section2 Managing Remote Repositories
|
||||||
|
|
||||||
|
@@ -49,7 +49,7 @@
|
|||||||
\list 1
|
\list 1
|
||||||
|
|
||||||
\li Select \uicontrol File > \uicontrol {New File or Project} >
|
\li Select \uicontrol File > \uicontrol {New File or Project} >
|
||||||
\uicontrol Application > \uicontrol {Qt Widgets Application} >
|
\uicontrol Application (Qt) > \uicontrol {Qt Widgets Application} >
|
||||||
\uicontrol Choose.
|
\uicontrol Choose.
|
||||||
|
|
||||||
\image qtcreator-new-qt-gui-application.png "New File or Project dialog"
|
\image qtcreator-new-qt-gui-application.png "New File or Project dialog"
|
||||||
@@ -61,20 +61,16 @@
|
|||||||
\li In the \uicontrol{Name} field, type \b {TextFinder}.
|
\li In the \uicontrol{Name} field, type \b {TextFinder}.
|
||||||
|
|
||||||
\li In the \uicontrol {Create in} field, enter the path for the project files.
|
\li In the \uicontrol {Create in} field, enter the path for the project files.
|
||||||
For example, \c {C:\Qt\examples}, and then click \uicontrol{Next} (on
|
For example, \c {C:\Qt\examples}, and then select \uicontrol{Next} (on
|
||||||
Windows and Linux) or \uicontrol Continue (on \macos).
|
Windows and Linux) or \uicontrol Continue (on \macos).
|
||||||
|
|
||||||
The \uicontrol {Kit Selection} dialog opens.
|
The \uicontrol {Define Build System} dialog opens.
|
||||||
|
|
||||||
\image qtcreator-new-project-qt-versions-qt-gui.png "Kit Selection dialog"
|
\image qtcreator-new-project-build-system-qt-gui.png "Define Build System dialog"
|
||||||
|
|
||||||
\li Select build and run \l{glossary-buildandrun-kit}{kits} for your project,
|
\li In the \uicontrol {Build system} field, select the build system to
|
||||||
and click \uicontrol Next or \uicontrol Continue.
|
use for building and running the project: \l qmake,
|
||||||
|
\l {Setting Up CMake}{CMake}, or \l {Setting Up Qbs}{Qbs}.
|
||||||
\note If only one kit is specified in \uicontrol Tools >
|
|
||||||
\uicontrol Options > \uicontrol Kits (on Windows and Linux) or in
|
|
||||||
\uicontrol {\QC} > \uicontrol Preferences > \uicontrol Kits
|
|
||||||
(on \macos), this dialog is skipped.
|
|
||||||
|
|
||||||
The \uicontrol{Class Information} dialog opens.
|
The \uicontrol{Class Information} dialog opens.
|
||||||
|
|
||||||
@@ -89,13 +85,20 @@
|
|||||||
\note The \uicontrol{Header file}, \uicontrol{Source file} and \uicontrol{Form file}
|
\note The \uicontrol{Header file}, \uicontrol{Source file} and \uicontrol{Form file}
|
||||||
fields are automatically updated to match the name of the class.
|
fields are automatically updated to match the name of the class.
|
||||||
|
|
||||||
\li Click \uicontrol Next or \uicontrol Continue.
|
The \uicontrol {Kit Selection} dialog opens.
|
||||||
|
|
||||||
|
\image qtcreator-new-project-qt-versions-qt-gui.png "Kit Selection dialog"
|
||||||
|
|
||||||
|
\li Select build and run \l{glossary-buildandrun-kit}{kits} for your project,
|
||||||
|
and select \uicontrol Next or \uicontrol Continue.
|
||||||
|
|
||||||
|
\li Select \uicontrol Next or \uicontrol Continue.
|
||||||
|
|
||||||
The \uicontrol{Project Management} dialog opens.
|
The \uicontrol{Project Management} dialog opens.
|
||||||
|
|
||||||
\image qtcreator-new-project-summary-qt-gui.png "Project Management dialog"
|
\image qtcreator-new-project-summary-qt-gui.png "Project Management dialog"
|
||||||
|
|
||||||
\li Review the project settings, and click \uicontrol{Finish} (on Windows and
|
\li Review the project settings, and select \uicontrol{Finish} (on Windows and
|
||||||
Linux) or \uicontrol Done (on \macos) to create the project.
|
Linux) or \uicontrol Done (on \macos) to create the project.
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
@@ -107,9 +110,9 @@
|
|||||||
|
|
||||||
\list
|
\list
|
||||||
|
|
||||||
|
\li main.cpp
|
||||||
\li textfinder.h
|
\li textfinder.h
|
||||||
\li textfinder.cpp
|
\li textfinder.cpp
|
||||||
\li main.cpp
|
|
||||||
\li textfinder.ui
|
\li textfinder.ui
|
||||||
\li textfinder.pro
|
\li textfinder.pro
|
||||||
|
|
||||||
@@ -150,7 +153,7 @@
|
|||||||
\uicontrol Sidebar. For example, to find the \uicontrol Label widget, start typing
|
\uicontrol Sidebar. For example, to find the \uicontrol Label widget, start typing
|
||||||
the word \b label.
|
the word \b label.
|
||||||
|
|
||||||
\image qtcreator-texfinder-filter.png "Filter field"
|
\image qtcreator-textfinder-filter.png "Filter field"
|
||||||
|
|
||||||
\li Double-click the \uicontrol{Label} widget and enter the text
|
\li Double-click the \uicontrol{Label} widget and enter the text
|
||||||
\b{Keyword}.
|
\b{Keyword}.
|
||||||
@@ -164,23 +167,23 @@
|
|||||||
\image qtcreator-textfinder-objectname.png "Changing object names"
|
\image qtcreator-textfinder-objectname.png "Changing object names"
|
||||||
|
|
||||||
\li Press \key {Ctrl+A} (or \key {Cmd+A}) to select the widgets and
|
\li Press \key {Ctrl+A} (or \key {Cmd+A}) to select the widgets and
|
||||||
click \uicontrol{Lay out Horizontally} (or press \uicontrol{Ctrl+H} on Linux or
|
select \uicontrol{Lay out Horizontally} (or press \key {Ctrl+H} on Linux or
|
||||||
Windows or \key {Ctrl+Shift+H} on \macos) to apply a horizontal
|
Windows or \key {Ctrl+Shift+H} on \macos) to apply a horizontal
|
||||||
layout (QHBoxLayout).
|
layout (QHBoxLayout).
|
||||||
|
|
||||||
\image qtcreator-texfinder-ui-horizontal-layout.png "Applying horizontal layout"
|
\image qtcreator-textfinder-ui-horizontal-layout.png "Applying horizontal layout"
|
||||||
|
|
||||||
\li Drag and drop a \uicontrol{Text Edit} widget (QTextEdit) to the form.
|
\li Drag and drop a \uicontrol{Text Edit} widget (QTextEdit) to the form.
|
||||||
|
|
||||||
\li Select the screen area and click \uicontrol{Lay out Vertically} (or press
|
\li Select the screen area, and then select \uicontrol{Lay out Vertically}
|
||||||
\uicontrol{Ctrl+L}) to apply a vertical layout (QVBoxLayout).
|
(or press \key {Ctrl+L}) to apply a vertical layout (QVBoxLayout).
|
||||||
|
|
||||||
\image qtcreator-textfinder-ui.png "Text Finder UI"
|
\image qtcreator-textfinder-ui.png "Text Finder UI"
|
||||||
|
|
||||||
Applying the horizontal and vertical layouts ensures that the
|
Applying the horizontal and vertical layouts ensures that the
|
||||||
application UI scales to different screen sizes.
|
application UI scales to different screen sizes.
|
||||||
|
|
||||||
\li To call a find function when users press the \uicontrol Find button, you
|
\li To call a find function when users select the \uicontrol Find button, you
|
||||||
use the Qt signals and slots mechanism. A signal is emitted when a
|
use the Qt signals and slots mechanism. A signal is emitted when a
|
||||||
particular event occurs and a slot is a function that is called in
|
particular event occurs and a slot is a function that is called in
|
||||||
response to a particular signal. Qt widgets have predefined signals
|
response to a particular signal. Qt widgets have predefined signals
|
||||||
@@ -201,7 +204,7 @@
|
|||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
\li Press \uicontrol{Ctrl+S} (or \key {Cmd+S}) to save your changes.
|
\li Press \key {Ctrl+S} (or \key {Cmd+S}) to save your changes.
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
@@ -295,7 +298,7 @@
|
|||||||
\li In the \uicontrol{Name} field, enter \b{textfinder}.
|
\li In the \uicontrol{Name} field, enter \b{textfinder}.
|
||||||
|
|
||||||
\li In the \uicontrol{Path} field, enter \c{C:\Qt\examples\TextFinder},
|
\li In the \uicontrol{Path} field, enter \c{C:\Qt\examples\TextFinder},
|
||||||
and click \uicontrol Next or \uicontrol Continue.
|
and select \uicontrol Next or \uicontrol Continue.
|
||||||
|
|
||||||
The \uicontrol{Project Management} dialog opens.
|
The \uicontrol{Project Management} dialog opens.
|
||||||
|
|
||||||
@@ -303,8 +306,8 @@
|
|||||||
|
|
||||||
|
|
||||||
\li In the \uicontrol{Add to project} field, select \b{TextFinder.pro}
|
\li In the \uicontrol{Add to project} field, select \b{TextFinder.pro}
|
||||||
and click \uicontrol{Finish} or \uicontrol Done to open the file in the code
|
and select \uicontrol{Finish} or \uicontrol Done to open the file
|
||||||
editor.
|
in the code editor.
|
||||||
|
|
||||||
\li Select \uicontrol Add > \uicontrol {Add Prefix}.
|
\li Select \uicontrol Add > \uicontrol {Add Prefix}.
|
||||||
|
|
||||||
@@ -320,7 +323,7 @@
|
|||||||
|
|
||||||
\section1 Compiling and Running Your Program
|
\section1 Compiling and Running Your Program
|
||||||
|
|
||||||
Now that you have all the necessary files, click the
|
Now that you have all the necessary files, select the
|
||||||
\inlineimage run_small.png
|
\inlineimage run_small.png
|
||||||
button to compile and run your program.
|
button to compile and run your program.
|
||||||
|
|
||||||
|
@@ -214,10 +214,6 @@ void TypeDescriptionReader::readComponent(UiObjectDefinition *ast)
|
|||||||
readSignalOrMethod(component, name == QLatin1String("Method"), fmo);
|
readSignalOrMethod(component, name == QLatin1String("Method"), fmo);
|
||||||
else if (name == QLatin1String("Enum"))
|
else if (name == QLatin1String("Enum"))
|
||||||
readEnum(component, fmo);
|
readEnum(component, fmo);
|
||||||
else
|
|
||||||
addWarning(component->firstSourceLocation(),
|
|
||||||
tr("Expected only Property, Method, Signal and Enum object definitions, not \"%1\".")
|
|
||||||
.arg(name));
|
|
||||||
} else if (script) {
|
} else if (script) {
|
||||||
QString name = toString(script->qualifiedId);
|
QString name = toString(script->qualifiedId);
|
||||||
if (name == QLatin1String("name")) {
|
if (name == QLatin1String("name")) {
|
||||||
@@ -238,14 +234,7 @@ void TypeDescriptionReader::readComponent(UiObjectDefinition *ast)
|
|||||||
fmo->setIsCreatable(readBoolBinding(script));
|
fmo->setIsCreatable(readBoolBinding(script));
|
||||||
} else if (name == QLatin1String("isComposite")) {
|
} else if (name == QLatin1String("isComposite")) {
|
||||||
fmo->setIsComposite(readBoolBinding(script));
|
fmo->setIsComposite(readBoolBinding(script));
|
||||||
} else {
|
|
||||||
addWarning(script->firstSourceLocation(),
|
|
||||||
tr("Expected only name, prototype, defaultProperty, attachedType, exports, "
|
|
||||||
"isSingleton, isCreatable, isComposite and exportMetaObjectRevisions "
|
|
||||||
"script bindings, not \"%1\".").arg(name));
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
addWarning(member->firstSourceLocation(), tr("Expected only script bindings and object definitions."));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -276,12 +265,7 @@ void TypeDescriptionReader::readModuleApi(UiObjectDefinition *ast)
|
|||||||
apiInfo.version = readNumericVersionBinding(script);
|
apiInfo.version = readNumericVersionBinding(script);
|
||||||
} else if (name == QLatin1String("name")) {
|
} else if (name == QLatin1String("name")) {
|
||||||
apiInfo.cppName = readStringBinding(script);
|
apiInfo.cppName = readStringBinding(script);
|
||||||
} else {
|
|
||||||
addWarning(script->firstSourceLocation(),
|
|
||||||
tr("Expected only uri, version and name script bindings."));
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
addWarning(member->firstSourceLocation(), tr("Expected only script bindings."));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -311,8 +295,6 @@ void TypeDescriptionReader::readSignalOrMethod(UiObjectDefinition *ast, bool isM
|
|||||||
QString name = toString(component->qualifiedTypeNameId);
|
QString name = toString(component->qualifiedTypeNameId);
|
||||||
if (name == QLatin1String("Parameter"))
|
if (name == QLatin1String("Parameter"))
|
||||||
readParameter(component, &fmm);
|
readParameter(component, &fmm);
|
||||||
else
|
|
||||||
addWarning(component->firstSourceLocation(), tr("Expected only Parameter object definitions."));
|
|
||||||
} else if (script) {
|
} else if (script) {
|
||||||
QString name = toString(script->qualifiedId);
|
QString name = toString(script->qualifiedId);
|
||||||
if (name == QLatin1String("name"))
|
if (name == QLatin1String("name"))
|
||||||
@@ -321,11 +303,6 @@ void TypeDescriptionReader::readSignalOrMethod(UiObjectDefinition *ast, bool isM
|
|||||||
fmm.setReturnType(readStringBinding(script));
|
fmm.setReturnType(readStringBinding(script));
|
||||||
else if (name == QLatin1String("revision"))
|
else if (name == QLatin1String("revision"))
|
||||||
fmm.setRevision(readIntBinding(script));
|
fmm.setRevision(readIntBinding(script));
|
||||||
else
|
|
||||||
addWarning(script->firstSourceLocation(), tr("Expected only name and type script bindings."));
|
|
||||||
|
|
||||||
} else {
|
|
||||||
addWarning(member->firstSourceLocation(), tr("Expected only script bindings and object definitions."));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -367,8 +344,6 @@ void TypeDescriptionReader::readProperty(UiObjectDefinition *ast, FakeMetaObject
|
|||||||
isList = readBoolBinding(script);
|
isList = readBoolBinding(script);
|
||||||
else if (id == QLatin1String("revision"))
|
else if (id == QLatin1String("revision"))
|
||||||
revision = readIntBinding(script);
|
revision = readIntBinding(script);
|
||||||
else
|
|
||||||
addWarning(script->firstSourceLocation(), tr("Expected only type, name, revision, isPointer, isReadonly and isList script bindings."));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (name.isEmpty() || type.isEmpty()) {
|
if (name.isEmpty() || type.isEmpty()) {
|
||||||
@@ -396,8 +371,6 @@ void TypeDescriptionReader::readEnum(UiObjectDefinition *ast, FakeMetaObject::Pt
|
|||||||
fme.setName(readStringBinding(script));
|
fme.setName(readStringBinding(script));
|
||||||
else if (name == QLatin1String("values"))
|
else if (name == QLatin1String("values"))
|
||||||
readEnumValues(script, &fme);
|
readEnumValues(script, &fme);
|
||||||
else
|
|
||||||
addWarning(script->firstSourceLocation(), tr("Expected only name and values script bindings."));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fmo->addEnum(fme);
|
fmo->addEnum(fme);
|
||||||
@@ -427,8 +400,6 @@ void TypeDescriptionReader::readParameter(UiObjectDefinition *ast, FakeMetaMetho
|
|||||||
// ### unhandled
|
// ### unhandled
|
||||||
} else if (id == QLatin1String("isList")) {
|
} else if (id == QLatin1String("isList")) {
|
||||||
// ### unhandled
|
// ### unhandled
|
||||||
} else {
|
|
||||||
addWarning(script->firstSourceLocation(), tr("Expected only name and type script bindings."));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -285,14 +285,9 @@ void AndroidSdkModel::selectMissingEssentials()
|
|||||||
if (!pendingPkgs.contains((*tool)->sdkStylePath()))
|
if (!pendingPkgs.contains((*tool)->sdkStylePath()))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if ((*tool)->type() == AndroidSdkPackage::PlatformToolsPackage)
|
addTool(tool);
|
||||||
addTool(tool); // Select Platform tools
|
|
||||||
else if ((*tool)->type() == AndroidSdkPackage::BuildToolsPackage)
|
|
||||||
addTool(tool); // Select build tools
|
|
||||||
else if ((*tool)->type() == AndroidSdkPackage::NDKPackage)
|
|
||||||
addTool(tool); // Select NDK Bundle
|
|
||||||
|
|
||||||
pendingPkgs.removeOne((*tool)->sdkStylePath());
|
pendingPkgs.removeOne((*tool)->sdkStylePath());
|
||||||
|
|
||||||
if (pendingPkgs.isEmpty())
|
if (pendingPkgs.isEmpty())
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@@ -820,7 +820,7 @@ void AndroidSettingsWidget::downloadOpenSslRepo(const bool silent)
|
|||||||
|
|
||||||
const QString openSslRepo("https://github.com/KDAB/android_openssl.git");
|
const QString openSslRepo("https://github.com/KDAB/android_openssl.git");
|
||||||
Utils::QtcProcess *gitCloner = new Utils::QtcProcess(this);
|
Utils::QtcProcess *gitCloner = new Utils::QtcProcess(this);
|
||||||
gitCloner->setCommand(Utils::CommandLine("git", {"clone", openSslRepo, openSslPath.fileName()}));
|
gitCloner->setCommand(Utils::CommandLine("git", {"clone", "--depth=1", openSslRepo, openSslPath.fileName()}));
|
||||||
gitCloner->setWorkingDirectory(openSslPath.parentDir().toString());
|
gitCloner->setWorkingDirectory(openSslPath.parentDir().toString());
|
||||||
|
|
||||||
QDir openSslDir(openSslPath.toString());
|
QDir openSslDir(openSslPath.toString());
|
||||||
|
@@ -212,6 +212,8 @@ bool QuickTestAstVisitor::visit(CPlusPlus::CallAST *ast)
|
|||||||
|
|
||||||
if (expressionListAST && expressionListAST->value) {
|
if (expressionListAST && expressionListAST->value) {
|
||||||
const auto *stringLitAST = expressionListAST->value->asStringLiteral();
|
const auto *stringLitAST = expressionListAST->value->asStringLiteral();
|
||||||
|
if (!stringLitAST)
|
||||||
|
return false;
|
||||||
const auto *string
|
const auto *string
|
||||||
= translationUnit()->stringLiteral(stringLitAST->literal_token);
|
= translationUnit()->stringLiteral(stringLitAST->literal_token);
|
||||||
if (string) {
|
if (string) {
|
||||||
|
@@ -312,11 +312,10 @@ RawProjectParts generateRawProjectParts(const PreprocessedData &input,
|
|||||||
const FilePath &sourceDirectory)
|
const FilePath &sourceDirectory)
|
||||||
{
|
{
|
||||||
RawProjectParts rpps;
|
RawProjectParts rpps;
|
||||||
|
const QDir sourceDir(sourceDirectory.toString());
|
||||||
|
|
||||||
int counter = 0;
|
int counter = 0;
|
||||||
for (const TargetDetails &t : input.targetDetails) {
|
for (const TargetDetails &t : input.targetDetails) {
|
||||||
QDir sourceDir(sourceDirectory.toString());
|
|
||||||
|
|
||||||
bool needPostfix = t.compileGroups.size() > 1;
|
bool needPostfix = t.compileGroups.size() > 1;
|
||||||
int count = 1;
|
int count = 1;
|
||||||
for (const CompileInfo &ci : t.compileGroups) {
|
for (const CompileInfo &ci : t.compileGroups) {
|
||||||
@@ -359,14 +358,15 @@ RawProjectParts generateRawProjectParts(const PreprocessedData &input,
|
|||||||
cxxProjectFlags.commandLineFlags = cProjectFlags.commandLineFlags;
|
cxxProjectFlags.commandLineFlags = cProjectFlags.commandLineFlags;
|
||||||
rpp.setFlagsForCxx(cxxProjectFlags);
|
rpp.setFlagsForCxx(cxxProjectFlags);
|
||||||
|
|
||||||
FilePath precompiled_header
|
FilePath precompiled_header = FilePath::fromString(
|
||||||
= FilePath::fromString(findOrDefault(t.sources, [&ending](const SourceInfo &si) {
|
findOrDefault(t.sources, [&ending](const SourceInfo &si) {
|
||||||
return si.path.endsWith(ending);
|
return si.path.endsWith(ending);
|
||||||
}).path);
|
}).path);
|
||||||
|
|
||||||
rpp.setFiles(transform<QList>(ci.sources, [&t, &sourceDir](const int si) {
|
rpp.setFiles(transform<QList>(ci.sources, [&t, &sourceDir](const int si) {
|
||||||
return sourceDir.absoluteFilePath(t.sources[static_cast<size_t>(si)].path);
|
return sourceDir.absoluteFilePath(t.sources[static_cast<size_t>(si)].path);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
if (!precompiled_header.isEmpty()) {
|
if (!precompiled_header.isEmpty()) {
|
||||||
if (precompiled_header.toFileInfo().isRelative()) {
|
if (precompiled_header.toFileInfo().isRelative()) {
|
||||||
const FilePath parentDir = FilePath::fromString(sourceDir.absolutePath());
|
const FilePath parentDir = FilePath::fromString(sourceDir.absolutePath());
|
||||||
@@ -381,6 +381,22 @@ RawProjectParts generateRawProjectParts(const PreprocessedData &input,
|
|||||||
rpps.append(rpp);
|
rpps.append(rpp);
|
||||||
++count;
|
++count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check sources for more files and associate them with the current target
|
||||||
|
const QStringList extraSources = Utils::transform<QList>(
|
||||||
|
Utils::filtered(t.sources, [](const SourceInfo &si) { return si.compileGroup == -1; }),
|
||||||
|
[&sourceDir](const SourceInfo &si) { return sourceDir.absoluteFilePath(si.path); });
|
||||||
|
if (!extraSources.isEmpty()) {
|
||||||
|
RawProjectPart rpp;
|
||||||
|
rpp.setProjectFileLocation(t.sourceDir.pathAppended("CMakeLists.txt").toString());
|
||||||
|
rpp.setBuildSystemTarget(t.name);
|
||||||
|
rpp.setDisplayName(t.id + "_extra");
|
||||||
|
|
||||||
|
rpp.setFiles(extraSources);
|
||||||
|
|
||||||
|
// This is all the information we have :-/
|
||||||
|
rpps.append(rpp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return rpps;
|
return rpps;
|
||||||
|
@@ -27,18 +27,21 @@
|
|||||||
#include "mcusupportoptions.h"
|
#include "mcusupportoptions.h"
|
||||||
#include "mcusupportsdk.h"
|
#include "mcusupportsdk.h"
|
||||||
|
|
||||||
|
#include <cmakeprojectmanager/cmaketoolmanager.h>
|
||||||
#include <coreplugin/icore.h>
|
#include <coreplugin/icore.h>
|
||||||
#include <coreplugin/helpmanager.h>
|
#include <coreplugin/helpmanager.h>
|
||||||
#include <cmakeprojectmanager/cmakekitinformation.h>
|
#include <cmakeprojectmanager/cmakekitinformation.h>
|
||||||
#include <debugger/debuggeritem.h>
|
#include <debugger/debuggeritem.h>
|
||||||
#include <debugger/debuggeritemmanager.h>
|
#include <debugger/debuggeritemmanager.h>
|
||||||
#include <debugger/debuggerkitinformation.h>
|
#include <debugger/debuggerkitinformation.h>
|
||||||
|
#include <projectexplorer/abi.h>
|
||||||
#include <projectexplorer/projectexplorerconstants.h>
|
#include <projectexplorer/projectexplorerconstants.h>
|
||||||
#include <projectexplorer/toolchain.h>
|
#include <projectexplorer/toolchain.h>
|
||||||
#include <projectexplorer/toolchainmanager.h>
|
#include <projectexplorer/toolchainmanager.h>
|
||||||
#include <projectexplorer/kitmanager.h>
|
#include <projectexplorer/kitmanager.h>
|
||||||
#include <projectexplorer/kitinformation.h>
|
#include <projectexplorer/kitinformation.h>
|
||||||
#include <projectexplorer/devicesupport/devicemanager.h>
|
#include <projectexplorer/devicesupport/devicemanager.h>
|
||||||
|
#include <qtsupport/qtkitinformation.h>
|
||||||
#include <qtsupport/qtversionmanager.h>
|
#include <qtsupport/qtversionmanager.h>
|
||||||
#include <utils/algorithm.h>
|
#include <utils/algorithm.h>
|
||||||
#include <utils/fileutils.h>
|
#include <utils/fileutils.h>
|
||||||
@@ -182,7 +185,7 @@ void McuPackage::updateStatus()
|
|||||||
const Utils::FilePath detectionPath = Utils::FilePath::fromString(
|
const Utils::FilePath detectionPath = Utils::FilePath::fromString(
|
||||||
m_fileChooser->filePath().toString() + "/" + m_detectionPath);
|
m_fileChooser->filePath().toString() + "/" + m_detectionPath);
|
||||||
const QString displayDetectionPath = Utils::FilePath::fromString(m_detectionPath).toUserOutput();
|
const QString displayDetectionPath = Utils::FilePath::fromString(m_detectionPath).toUserOutput();
|
||||||
const bool validPackage = detectionPath.exists();
|
const bool validPackage = m_detectionPath.isEmpty() || detectionPath.exists();
|
||||||
|
|
||||||
m_status = validPath ? (validPackage ? ValidPackage : ValidPathInvalidPackage) : InvalidPath;
|
m_status = validPath ? (validPackage ? ValidPackage : ValidPathInvalidPackage) : InvalidPath;
|
||||||
|
|
||||||
@@ -192,7 +195,9 @@ void McuPackage::updateStatus()
|
|||||||
QString statusText;
|
QString statusText;
|
||||||
switch (m_status) {
|
switch (m_status) {
|
||||||
case ValidPackage:
|
case ValidPackage:
|
||||||
statusText = tr("Path is valid, \"%1\" was found.").arg(displayDetectionPath);
|
statusText = m_detectionPath.isEmpty()
|
||||||
|
? "Path exists." // TODO tr()
|
||||||
|
: tr("Path is valid, \"%1\" was found.").arg(displayDetectionPath);
|
||||||
break;
|
break;
|
||||||
case ValidPathInvalidPackage:
|
case ValidPathInvalidPackage:
|
||||||
statusText = tr("Path exists, but does not contain \"%1\".").arg(displayDetectionPath);
|
statusText = tr("Path exists, but does not contain \"%1\".").arg(displayDetectionPath);
|
||||||
@@ -217,6 +222,22 @@ McuToolChainPackage::Type McuToolChainPackage::type() const
|
|||||||
return m_type;
|
return m_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ProjectExplorer::ToolChain *desktopToolChain(Core::Id language)
|
||||||
|
{
|
||||||
|
using namespace ProjectExplorer;
|
||||||
|
|
||||||
|
ToolChain *toolChain = ToolChainManager::toolChain([language](const ToolChain *t) {
|
||||||
|
const Abi abi = t->targetAbi();
|
||||||
|
return (abi.os() != Abi::WindowsOS
|
||||||
|
|| (abi.osFlavor() == Abi::WindowsMsvc2017Flavor
|
||||||
|
|| abi.osFlavor() == Abi::WindowsMsvc2019Flavor))
|
||||||
|
&& abi.architecture() == Abi::X86Architecture
|
||||||
|
&& abi.wordWidth() == 64
|
||||||
|
&& t->language() == language;
|
||||||
|
});
|
||||||
|
return toolChain;
|
||||||
|
}
|
||||||
|
|
||||||
static ProjectExplorer::ToolChain* armGccToolChain(const Utils::FilePath &path, Core::Id language)
|
static ProjectExplorer::ToolChain* armGccToolChain(const Utils::FilePath &path, Core::Id language)
|
||||||
{
|
{
|
||||||
using namespace ProjectExplorer;
|
using namespace ProjectExplorer;
|
||||||
@@ -245,24 +266,30 @@ static ProjectExplorer::ToolChain* armGccToolChain(const Utils::FilePath &path,
|
|||||||
|
|
||||||
ProjectExplorer::ToolChain *McuToolChainPackage::toolChain(Core::Id language) const
|
ProjectExplorer::ToolChain *McuToolChainPackage::toolChain(Core::Id language) const
|
||||||
{
|
{
|
||||||
const QLatin1String compilerName(
|
ProjectExplorer::ToolChain *tc = nullptr;
|
||||||
language == ProjectExplorer::Constants::C_LANGUAGE_ID ? "gcc" : "g++");
|
if (m_type == TypeDesktop) {
|
||||||
const Utils::FilePath compiler = Utils::FilePath::fromUserInput(
|
tc = desktopToolChain(language);
|
||||||
Utils::HostOsInfo::withExecutableSuffix(
|
} else {
|
||||||
path() + (
|
const QLatin1String compilerName(
|
||||||
m_type == TypeArmGcc
|
language == ProjectExplorer::Constants::C_LANGUAGE_ID ? "gcc" : "g++");
|
||||||
? "/bin/arm-none-eabi-%1" : m_type == TypeIAR
|
const Utils::FilePath compiler = Utils::FilePath::fromUserInput(
|
||||||
? "/foo/bar-iar-%1" : "/bar/foo-keil-%1")).arg(compilerName));
|
Utils::HostOsInfo::withExecutableSuffix(
|
||||||
|
path() + (
|
||||||
|
m_type == TypeArmGcc
|
||||||
|
? "/bin/arm-none-eabi-%1" : m_type == TypeIAR
|
||||||
|
? "/foo/bar-iar-%1" : "/bar/foo-keil-%1")).arg(compilerName));
|
||||||
|
|
||||||
ProjectExplorer::ToolChain *tc = armGccToolChain(compiler, language);
|
tc = armGccToolChain(compiler, language);
|
||||||
|
}
|
||||||
return tc;
|
return tc;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString McuToolChainPackage::cmakeToolChainFileName() const
|
QString McuToolChainPackage::cmakeToolChainFileName() const
|
||||||
{
|
{
|
||||||
return QLatin1String(m_type == TypeArmGcc
|
return QLatin1String(m_type == TypeArmGcc
|
||||||
? "armgcc.cmake" : m_type == McuToolChainPackage::TypeIAR
|
? "armgcc" : m_type == McuToolChainPackage::TypeIAR
|
||||||
? "iar.cmake" : "keil.cmake");
|
? "iar" : m_type == McuToolChainPackage::TypeKEIL
|
||||||
|
? "keil" : "ghs") + QLatin1String(".cmake");
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariant McuToolChainPackage::debuggerId() const
|
QVariant McuToolChainPackage::debuggerId() const
|
||||||
@@ -429,11 +456,6 @@ Utils::FilePath McuSupportOptions::qulDirFromSettings()
|
|||||||
packagePathFromSettings(Constants::SETTINGS_KEY_PACKAGE_QT_FOR_MCUS_SDK));
|
packagePathFromSettings(Constants::SETTINGS_KEY_PACKAGE_QT_FOR_MCUS_SDK));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool mcuTargetIsDesktop(const McuTarget* mcuTarget)
|
|
||||||
{
|
|
||||||
return mcuTarget->qulPlatform() == "Qt";
|
|
||||||
}
|
|
||||||
|
|
||||||
static Utils::FilePath jomExecutablePath()
|
static Utils::FilePath jomExecutablePath()
|
||||||
{
|
{
|
||||||
return Utils::HostOsInfo::isWindowsHost() ?
|
return Utils::HostOsInfo::isWindowsHost() ?
|
||||||
@@ -453,21 +475,23 @@ static void setKitProperties(const QString &kitName, ProjectExplorer::Kit *k,
|
|||||||
McuSupportOptions::supportedQulVersion().toString());
|
McuSupportOptions::supportedQulVersion().toString());
|
||||||
k->setAutoDetected(true);
|
k->setAutoDetected(true);
|
||||||
k->makeSticky();
|
k->makeSticky();
|
||||||
if (mcuTargetIsDesktop(mcuTarget)) {
|
if (mcuTarget->toolChainPackage()->type() == McuToolChainPackage::TypeDesktop)
|
||||||
k->setDeviceTypeForIcon(Constants::DEVICE_TYPE);
|
k->setDeviceTypeForIcon(Constants::DEVICE_TYPE);
|
||||||
} else {
|
QSet<Core::Id> irrelevant = {
|
||||||
QSet<Core::Id> irrelevant = {
|
SysRootKitAspect::id(),
|
||||||
SysRootKitAspect::id(),
|
QtSupport::QtKitAspect::id()
|
||||||
"QtSupport.QtInformation" // QtKitAspect::id()
|
};
|
||||||
};
|
if (jomExecutablePath().exists()) // TODO: add id() getter to CMakeGeneratorKitAspect
|
||||||
if (jomExecutablePath().exists()) // TODO: add id() getter to CMakeGeneratorKitAspect
|
irrelevant.insert("CMake.GeneratorKitInformation");
|
||||||
irrelevant.insert("CMake.GeneratorKitInformation");
|
k->setIrrelevantAspects(irrelevant);
|
||||||
k->setIrrelevantAspects(irrelevant);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setKitToolchains(ProjectExplorer::Kit *k, const McuToolChainPackage *tcPackage)
|
static void setKitToolchains(ProjectExplorer::Kit *k, const McuToolChainPackage *tcPackage)
|
||||||
{
|
{
|
||||||
|
// No Green Hills toolchain, because support for it is missing.
|
||||||
|
if (tcPackage->type() == McuToolChainPackage::TypeGHS)
|
||||||
|
return;
|
||||||
|
|
||||||
ProjectExplorer::ToolChainKitAspect::setToolChain(k, tcPackage->toolChain(
|
ProjectExplorer::ToolChainKitAspect::setToolChain(k, tcPackage->toolChain(
|
||||||
ProjectExplorer::Constants::C_LANGUAGE_ID));
|
ProjectExplorer::Constants::C_LANGUAGE_ID));
|
||||||
ProjectExplorer::ToolChainKitAspect::setToolChain(k, tcPackage->toolChain(
|
ProjectExplorer::ToolChainKitAspect::setToolChain(k, tcPackage->toolChain(
|
||||||
@@ -476,11 +500,22 @@ static void setKitToolchains(ProjectExplorer::Kit *k, const McuToolChainPackage
|
|||||||
|
|
||||||
static void setKitDebugger(ProjectExplorer::Kit *k, const McuToolChainPackage *tcPackage)
|
static void setKitDebugger(ProjectExplorer::Kit *k, const McuToolChainPackage *tcPackage)
|
||||||
{
|
{
|
||||||
|
// Qt Creator seems to be smart enough to deduce the right Kit debugger from the ToolChain
|
||||||
|
// We rely on that at least in the Desktop case.
|
||||||
|
if (tcPackage->type() == McuToolChainPackage::TypeDesktop
|
||||||
|
// No Green Hills debugger, because support for it is missing.
|
||||||
|
|| tcPackage->type() == McuToolChainPackage::TypeGHS)
|
||||||
|
return;
|
||||||
|
|
||||||
Debugger::DebuggerKitAspect::setDebugger(k, tcPackage->debuggerId());
|
Debugger::DebuggerKitAspect::setDebugger(k, tcPackage->debuggerId());
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setKitDevice(ProjectExplorer::Kit *k)
|
static void setKitDevice(ProjectExplorer::Kit *k, const McuTarget* mcuTarget)
|
||||||
{
|
{
|
||||||
|
// "Device Type" Desktop is the default. We use that for the Qt for MCUs Desktop Kit
|
||||||
|
if (mcuTarget->toolChainPackage()->type() == McuToolChainPackage::TypeDesktop)
|
||||||
|
return;
|
||||||
|
|
||||||
ProjectExplorer::DeviceTypeKitAspect::setDeviceTypeId(k, Constants::DEVICE_TYPE);
|
ProjectExplorer::DeviceTypeKitAspect::setDeviceTypeId(k, Constants::DEVICE_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -492,6 +527,13 @@ static void setKitEnvironment(ProjectExplorer::Kit *k, const McuTarget* mcuTarge
|
|||||||
Utils::EnvironmentItems changes;
|
Utils::EnvironmentItems changes;
|
||||||
QStringList pathAdditions;
|
QStringList pathAdditions;
|
||||||
|
|
||||||
|
// The Desktop version depends on the Qt shared libs in Qul_DIR/bin.
|
||||||
|
// If CMake's fileApi is avaialble, we can rely on the "Add library search path to PATH"
|
||||||
|
// feature of the run configuration. Otherwise, we just prepend the path, here.
|
||||||
|
if (mcuTarget->toolChainPackage()->type() == McuToolChainPackage::TypeDesktop
|
||||||
|
&& !CMakeProjectManager::CMakeToolManager::defaultCMakeTool()->hasFileApi())
|
||||||
|
pathAdditions.append(QDir::toNativeSeparators(qtForMCUsSdkPackage->path() + "/bin"));
|
||||||
|
|
||||||
QVector<McuPackage *> packagesIncludingSdk;
|
QVector<McuPackage *> packagesIncludingSdk;
|
||||||
packagesIncludingSdk.reserve(mcuTarget->packages().size() + 1);
|
packagesIncludingSdk.reserve(mcuTarget->packages().size() + 1);
|
||||||
packagesIncludingSdk.append(mcuTarget->packages());
|
packagesIncludingSdk.append(mcuTarget->packages());
|
||||||
@@ -517,9 +559,12 @@ static void setKitCMakeOptions(ProjectExplorer::Kit *k, const McuTarget* mcuTarg
|
|||||||
using namespace CMakeProjectManager;
|
using namespace CMakeProjectManager;
|
||||||
|
|
||||||
CMakeConfig config = CMakeConfigurationKitAspect::configuration(k);
|
CMakeConfig config = CMakeConfigurationKitAspect::configuration(k);
|
||||||
config.append(CMakeConfigItem("CMAKE_CXX_COMPILER", "%{Compiler:Executable:Cxx}"));
|
// CMake ToolChain file for ghs handles CMAKE_*_COMPILER autonomously
|
||||||
config.append(CMakeConfigItem("CMAKE_C_COMPILER", "%{Compiler:Executable:C}"));
|
if (mcuTarget->toolChainPackage()->type() != McuToolChainPackage::TypeGHS) {
|
||||||
if (mcuTarget->toolChainPackage())
|
config.append(CMakeConfigItem("CMAKE_CXX_COMPILER", "%{Compiler:Executable:Cxx}"));
|
||||||
|
config.append(CMakeConfigItem("CMAKE_C_COMPILER", "%{Compiler:Executable:C}"));
|
||||||
|
}
|
||||||
|
if (mcuTarget->toolChainPackage()->type() != McuToolChainPackage::TypeDesktop)
|
||||||
config.append(CMakeConfigItem(
|
config.append(CMakeConfigItem(
|
||||||
"CMAKE_TOOLCHAIN_FILE",
|
"CMAKE_TOOLCHAIN_FILE",
|
||||||
(qulDir + "/lib/cmake/Qul/toolchain/"
|
(qulDir + "/lib/cmake/Qul/toolchain/"
|
||||||
@@ -528,8 +573,6 @@ static void setKitCMakeOptions(ProjectExplorer::Kit *k, const McuTarget* mcuTarg
|
|||||||
(qulDir + "/lib/cmake/Qul/QulGenerators.cmake").toUtf8()));
|
(qulDir + "/lib/cmake/Qul/QulGenerators.cmake").toUtf8()));
|
||||||
config.append(CMakeConfigItem("QUL_PLATFORM",
|
config.append(CMakeConfigItem("QUL_PLATFORM",
|
||||||
mcuTarget->qulPlatform().toUtf8()));
|
mcuTarget->qulPlatform().toUtf8()));
|
||||||
if (mcuTargetIsDesktop(mcuTarget))
|
|
||||||
config.append(CMakeConfigItem("CMAKE_PREFIX_PATH", "%{Qt:QT_INSTALL_PREFIX}"));
|
|
||||||
if (mcuTarget->colorDepth() >= 0)
|
if (mcuTarget->colorDepth() >= 0)
|
||||||
config.append(CMakeConfigItem("QUL_COLOR_DEPTH",
|
config.append(CMakeConfigItem("QUL_COLOR_DEPTH",
|
||||||
QString::number(mcuTarget->colorDepth()).toLatin1()));
|
QString::number(mcuTarget->colorDepth()).toLatin1()));
|
||||||
@@ -541,14 +584,24 @@ static void setKitCMakeOptions(ProjectExplorer::Kit *k, const McuTarget* mcuTarg
|
|||||||
CMakeConfigurationKitAspect::setConfiguration(k, config);
|
CMakeConfigurationKitAspect::setConfiguration(k, config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void setKitQtVersionOptions(ProjectExplorer::Kit *k)
|
||||||
|
{
|
||||||
|
QtSupport::QtKitAspect::setQtVersion(k, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
QString McuSupportOptions::kitName(const McuTarget *mcuTarget) const
|
QString McuSupportOptions::kitName(const McuTarget *mcuTarget) const
|
||||||
{
|
{
|
||||||
// TODO: get version from qulSdkPackage and insert into name
|
// TODO: get version from qulSdkPackage and insert into name
|
||||||
const QString colorDepth = mcuTarget->colorDepth() > 0
|
const QString colorDepth = mcuTarget->colorDepth() > 0
|
||||||
? QString::fromLatin1(" %1bpp").arg(mcuTarget->colorDepth())
|
? QString::fromLatin1(" %1bpp").arg(mcuTarget->colorDepth())
|
||||||
: "";
|
: "";
|
||||||
|
// Hack: Use the platform name in the kit name. Exception for the "Qt" platform: use "Desktop"
|
||||||
|
const QString targetName =
|
||||||
|
mcuTarget->toolChainPackage()->type() == McuToolChainPackage::TypeDesktop
|
||||||
|
? "Desktop"
|
||||||
|
: mcuTarget->qulPlatform();
|
||||||
return QString::fromLatin1("Qt for MCUs %1 - %2%3")
|
return QString::fromLatin1("Qt for MCUs %1 - %2%3")
|
||||||
.arg(supportedQulVersion().toString(), mcuTarget->qulPlatform(), colorDepth);
|
.arg(supportedQulVersion().toString(), targetName, colorDepth);
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<ProjectExplorer::Kit *> McuSupportOptions::existingKits(const McuTarget *mcuTargt)
|
QList<ProjectExplorer::Kit *> McuSupportOptions::existingKits(const McuTarget *mcuTargt)
|
||||||
@@ -568,13 +621,12 @@ ProjectExplorer::Kit *McuSupportOptions::newKit(const McuTarget *mcuTarget)
|
|||||||
KitGuard kitGuard(k);
|
KitGuard kitGuard(k);
|
||||||
|
|
||||||
setKitProperties(kitName(mcuTarget), k, mcuTarget);
|
setKitProperties(kitName(mcuTarget), k, mcuTarget);
|
||||||
if (!mcuTargetIsDesktop(mcuTarget)) {
|
setKitDevice(k, mcuTarget);
|
||||||
setKitToolchains(k, mcuTarget->toolChainPackage());
|
setKitToolchains(k, mcuTarget->toolChainPackage());
|
||||||
setKitDebugger(k, mcuTarget->toolChainPackage());
|
setKitDebugger(k, mcuTarget->toolChainPackage());
|
||||||
setKitDevice(k);
|
|
||||||
}
|
|
||||||
setKitEnvironment(k, mcuTarget, qtForMCUsSdkPackage);
|
setKitEnvironment(k, mcuTarget, qtForMCUsSdkPackage);
|
||||||
setKitCMakeOptions(k, mcuTarget, qtForMCUsSdkPackage->path());
|
setKitCMakeOptions(k, mcuTarget, qtForMCUsSdkPackage->path());
|
||||||
|
setKitQtVersionOptions(k);
|
||||||
|
|
||||||
k->setup();
|
k->setup();
|
||||||
k->fix();
|
k->fix();
|
||||||
|
@@ -109,7 +109,9 @@ public:
|
|||||||
enum Type {
|
enum Type {
|
||||||
TypeArmGcc,
|
TypeArmGcc,
|
||||||
TypeIAR,
|
TypeIAR,
|
||||||
TypeKEIL
|
TypeKEIL,
|
||||||
|
TypeGHS,
|
||||||
|
TypeDesktop
|
||||||
};
|
};
|
||||||
|
|
||||||
McuToolChainPackage(const QString &label, const QString &defaultPath,
|
McuToolChainPackage(const QString &label, const QString &defaultPath,
|
||||||
|
@@ -60,6 +60,11 @@ McuPackage *createQtForMCUsPackage()
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static McuToolChainPackage *createDesktopToolChainPackage()
|
||||||
|
{
|
||||||
|
return new McuToolChainPackage({}, {}, {}, {}, McuToolChainPackage::TypeDesktop);
|
||||||
|
}
|
||||||
|
|
||||||
static McuToolChainPackage *createArmGccPackage()
|
static McuToolChainPackage *createArmGccPackage()
|
||||||
{
|
{
|
||||||
const char envVar[] = "ARMGCC_DIR";
|
const char envVar[] = "ARMGCC_DIR";
|
||||||
@@ -93,6 +98,50 @@ static McuToolChainPackage *createArmGccPackage()
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static McuToolChainPackage *createGhsToolchainPackage()
|
||||||
|
{
|
||||||
|
const char envVar[] = "GHS_COMPILER_DIR";
|
||||||
|
|
||||||
|
const QString defaultPath =
|
||||||
|
qEnvironmentVariableIsSet(envVar) ? qEnvironmentVariable(envVar) : QDir::homePath();
|
||||||
|
|
||||||
|
auto result = new McuToolChainPackage(
|
||||||
|
"Green Hills Compiler",
|
||||||
|
defaultPath,
|
||||||
|
Utils::HostOsInfo::withExecutableSuffix("ccv850"),
|
||||||
|
"GHSToolchain",
|
||||||
|
McuToolChainPackage::TypeGHS);
|
||||||
|
result->setEnvironmentVariableName(envVar);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static McuPackage *createRGLPackage()
|
||||||
|
{
|
||||||
|
const char envVar[] = "RGL_DIR";
|
||||||
|
|
||||||
|
QString defaultPath;
|
||||||
|
if (qEnvironmentVariableIsSet(envVar)) {
|
||||||
|
defaultPath = qEnvironmentVariable(envVar);
|
||||||
|
} else if (Utils::HostOsInfo::isWindowsHost()) {
|
||||||
|
defaultPath = QDir::rootPath() + "Renesas_Electronics/D1x_RGL";
|
||||||
|
if (QFileInfo::exists(defaultPath)) {
|
||||||
|
const QFileInfoList subDirs =
|
||||||
|
QDir(defaultPath).entryInfoList({QLatin1String("rgl_ghs_D1Mx_*")},
|
||||||
|
QDir::Dirs | QDir::NoDotAndDotDot);
|
||||||
|
if (subDirs.count() == 1)
|
||||||
|
defaultPath = subDirs.first().filePath() + '/';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto result = new McuPackage(
|
||||||
|
"Renesas Graphics Library",
|
||||||
|
defaultPath,
|
||||||
|
{},
|
||||||
|
"RGL");
|
||||||
|
result->setEnvironmentVariableName(envVar);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static McuPackage *createStm32CubeFwF7SdkPackage()
|
static McuPackage *createStm32CubeFwF7SdkPackage()
|
||||||
{
|
{
|
||||||
auto result = new McuPackage(
|
auto result = new McuPackage(
|
||||||
@@ -140,21 +189,34 @@ static McuPackage *createEvkbImxrt1050SdkPackage()
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static McuPackage *createSeggerJLinkPackage()
|
static McuPackage *createMcuXpressoIdePackage()
|
||||||
{
|
{
|
||||||
QString defaultPath = QString("%{Env:SEGGER_JLINK_SOFTWARE_AND_DOCUMENTATION_PATH}");
|
const char envVar[] = "MCUXpressoIDE_PATH";
|
||||||
if (Utils::HostOsInfo::isWindowsHost()) {
|
|
||||||
const QString programPath = findInProgramFiles("/SEGGER/JLink");
|
QString defaultPath;
|
||||||
if (!programPath.isEmpty())
|
if (qEnvironmentVariableIsSet(envVar)) {
|
||||||
defaultPath = programPath;
|
defaultPath = qEnvironmentVariable(envVar);
|
||||||
|
} else if (Utils::HostOsInfo::isWindowsHost()) {
|
||||||
|
defaultPath = QDir::rootPath() + "nxp";
|
||||||
|
if (QFileInfo::exists(defaultPath)) {
|
||||||
|
// If default dir has exactly one sub dir that could be the IDE path, pre-select that.
|
||||||
|
const QFileInfoList subDirs =
|
||||||
|
QDir(defaultPath).entryInfoList({QLatin1String("MCUXpressoIDE*")},
|
||||||
|
QDir::Dirs | QDir::NoDotAndDotDot);
|
||||||
|
if (subDirs.count() == 1)
|
||||||
|
defaultPath = subDirs.first().filePath() + '/';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
defaultPath = "/usr/local/mcuxpressoide/";
|
||||||
}
|
}
|
||||||
|
|
||||||
auto result = new McuPackage(
|
auto result = new McuPackage(
|
||||||
McuPackage::tr("SEGGER JLink"),
|
"MCUXpresso IDE",
|
||||||
defaultPath,
|
defaultPath,
|
||||||
Utils::HostOsInfo::withExecutableSuffix("JLink"),
|
Utils::HostOsInfo::withExecutableSuffix("ide/binaries/crt_emu_cm_redlink"),
|
||||||
"SeggerJLink");
|
"MCUXpressoIDE");
|
||||||
result->setDownloadUrl("https://www.segger.com/downloads/jlink");
|
result->setDownloadUrl("https://www.nxp.com/mcuxpresso/ide");
|
||||||
result->setEnvironmentVariableName("SEGGER_JLINK_SOFTWARE_AND_DOCUMENTATION_PATH");
|
result->setEnvironmentVariableName(envVar);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,21 +224,25 @@ void hardcodedTargetsAndPackages(const Utils::FilePath &dir, QVector<McuPackage
|
|||||||
QVector<McuTarget *> *mcuTargets)
|
QVector<McuTarget *> *mcuTargets)
|
||||||
{
|
{
|
||||||
McuToolChainPackage* armGccPackage = Sdk::createArmGccPackage();
|
McuToolChainPackage* armGccPackage = Sdk::createArmGccPackage();
|
||||||
|
McuToolChainPackage *ghsToolchainPackage = createGhsToolchainPackage();
|
||||||
|
McuToolChainPackage* desktopToolChainPackage = createDesktopToolChainPackage();
|
||||||
McuPackage* stm32CubeFwF7SdkPackage = Sdk::createStm32CubeFwF7SdkPackage();
|
McuPackage* stm32CubeFwF7SdkPackage = Sdk::createStm32CubeFwF7SdkPackage();
|
||||||
McuPackage* stm32CubeProgrammerPackage = Sdk::createStm32CubeProgrammerPackage();
|
McuPackage* stm32CubeProgrammerPackage = Sdk::createStm32CubeProgrammerPackage();
|
||||||
McuPackage* evkbImxrt1050SdkPackage = Sdk::createEvkbImxrt1050SdkPackage();
|
McuPackage* evkbImxrt1050SdkPackage = Sdk::createEvkbImxrt1050SdkPackage();
|
||||||
McuPackage* seggerJLinkPackage = Sdk::createSeggerJLinkPackage();
|
McuPackage *mcuXpressoIdePackage = createMcuXpressoIdePackage();
|
||||||
|
McuPackage *rglPackage = createRGLPackage();
|
||||||
|
|
||||||
QVector<McuPackage*> stmEvalPackages = {
|
QVector<McuPackage*> stmEvalPackages = {
|
||||||
armGccPackage, stm32CubeProgrammerPackage};
|
armGccPackage, stm32CubeProgrammerPackage};
|
||||||
QVector<McuPackage*> nxpEvalPackages = {
|
QVector<McuPackage*> nxpEvalPackages = {
|
||||||
armGccPackage, seggerJLinkPackage};
|
armGccPackage, mcuXpressoIdePackage};
|
||||||
QVector<McuPackage*> renesasEvalPackages = {
|
QVector<McuPackage*> renesasEvalPackages = {
|
||||||
armGccPackage, seggerJLinkPackage};
|
ghsToolchainPackage, rglPackage};
|
||||||
QVector<McuPackage*> desktopPackages = {};
|
QVector<McuPackage*> desktopPackages = {};
|
||||||
*packages = {
|
*packages = {
|
||||||
armGccPackage, stm32CubeFwF7SdkPackage, stm32CubeProgrammerPackage, evkbImxrt1050SdkPackage,
|
armGccPackage, desktopToolChainPackage, ghsToolchainPackage,
|
||||||
seggerJLinkPackage};
|
stm32CubeFwF7SdkPackage, stm32CubeProgrammerPackage, evkbImxrt1050SdkPackage,
|
||||||
|
mcuXpressoIdePackage, rglPackage};
|
||||||
|
|
||||||
const QString vendorStm = "STM";
|
const QString vendorStm = "STM";
|
||||||
const QString vendorNxp = "NXP";
|
const QString vendorNxp = "NXP";
|
||||||
@@ -192,8 +258,8 @@ void hardcodedTargetsAndPackages(const Utils::FilePath &dir, QVector<McuPackage
|
|||||||
} targets[] = {
|
} targets[] = {
|
||||||
{vendorNxp, {"MIMXRT1050-EVK"}, nxpEvalPackages, armGccPackage, {16}},
|
{vendorNxp, {"MIMXRT1050-EVK"}, nxpEvalPackages, armGccPackage, {16}},
|
||||||
{vendorNxp, {"MIMXRT1064-EVK"}, nxpEvalPackages, armGccPackage, {16}},
|
{vendorNxp, {"MIMXRT1064-EVK"}, nxpEvalPackages, armGccPackage, {16}},
|
||||||
{vendorQt, {"Qt"}, desktopPackages, nullptr, {32}},
|
{vendorQt, {"Qt"}, desktopPackages, desktopToolChainPackage, {32}},
|
||||||
{vendorRenesas, {"RH850-D1M1A"}, renesasEvalPackages, armGccPackage, {32}},
|
{vendorRenesas, {"RH850-D1M1A"}, renesasEvalPackages, ghsToolchainPackage, {32}},
|
||||||
{vendorStm, {"STM32F469I-DISCOVERY"}, stmEvalPackages, armGccPackage, {24}},
|
{vendorStm, {"STM32F469I-DISCOVERY"}, stmEvalPackages, armGccPackage, {24}},
|
||||||
{vendorStm, {"STM32F7508-DISCOVERY"}, stmEvalPackages, armGccPackage, {32, 16}},
|
{vendorStm, {"STM32F7508-DISCOVERY"}, stmEvalPackages, armGccPackage, {32, 16}},
|
||||||
{vendorStm, {"STM32F769I-DISCOVERY"}, stmEvalPackages, armGccPackage, {32}},
|
{vendorStm, {"STM32F769I-DISCOVERY"}, stmEvalPackages, armGccPackage, {32}},
|
||||||
|
@@ -159,6 +159,14 @@ QbsBuildConfiguration::QbsBuildConfiguration(Target *target, Core::Id id)
|
|||||||
|
|
||||||
QbsBuildConfiguration::~QbsBuildConfiguration()
|
QbsBuildConfiguration::~QbsBuildConfiguration()
|
||||||
{
|
{
|
||||||
|
for (BuildStep * const bs : buildSteps()->steps()) {
|
||||||
|
if (const auto qbs = qobject_cast<QbsBuildStep *>(bs))
|
||||||
|
qbs->dropSession();
|
||||||
|
}
|
||||||
|
for (BuildStep * const cs : cleanSteps()->steps()) {
|
||||||
|
if (const auto qcs = qobject_cast<QbsCleanStep *>(cs))
|
||||||
|
qcs->dropSession();
|
||||||
|
}
|
||||||
delete m_buildSystem;
|
delete m_buildSystem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -537,6 +537,15 @@ QbsBuildStepData QbsBuildStep::stepData() const
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QbsBuildStep::dropSession()
|
||||||
|
{
|
||||||
|
if (m_session) {
|
||||||
|
doCancel();
|
||||||
|
m_session->disconnect(this);
|
||||||
|
m_session = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
// QbsBuildStepConfigWidget:
|
// QbsBuildStepConfigWidget:
|
||||||
|
@@ -73,6 +73,8 @@ public:
|
|||||||
QbsBuildSystem *qbsBuildSystem() const;
|
QbsBuildSystem *qbsBuildSystem() const;
|
||||||
QbsBuildStepData stepData() const;
|
QbsBuildStepData stepData() const;
|
||||||
|
|
||||||
|
void dropSession();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void qbsConfigurationChanged();
|
void qbsConfigurationChanged();
|
||||||
void qbsBuildOptionsChanged();
|
void qbsBuildOptionsChanged();
|
||||||
|
@@ -85,6 +85,15 @@ QbsCleanStep::~QbsCleanStep()
|
|||||||
m_session->disconnect(this);
|
m_session->disconnect(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QbsCleanStep::dropSession()
|
||||||
|
{
|
||||||
|
if (m_session) {
|
||||||
|
doCancel();
|
||||||
|
m_session->disconnect(this);
|
||||||
|
m_session = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool QbsCleanStep::init()
|
bool QbsCleanStep::init()
|
||||||
{
|
{
|
||||||
if (buildSystem()->isParsing() || m_session)
|
if (buildSystem()->isParsing() || m_session)
|
||||||
|
@@ -46,6 +46,8 @@ public:
|
|||||||
|
|
||||||
QbsBuildStepData stepData() const;
|
QbsBuildStepData stepData() const;
|
||||||
|
|
||||||
|
void dropSession();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool init() override;
|
bool init() override;
|
||||||
void doRun() override;
|
void doRun() override;
|
||||||
|
@@ -106,7 +106,8 @@ void DragTool::createQmlItemNode(const ItemLibraryEntry &itemLibraryEntry,
|
|||||||
|
|
||||||
m_dragNode = QmlItemNode::createQmlItemNode(view(), itemLibraryEntry, itemPos, parentNode);
|
m_dragNode = QmlItemNode::createQmlItemNode(view(), itemLibraryEntry, itemPos, parentNode);
|
||||||
|
|
||||||
m_dragNode.setFlowItemPosition(positonInItemSpace);
|
if (rootIsFlow)
|
||||||
|
m_dragNode.setFlowItemPosition(positonInItemSpace);
|
||||||
|
|
||||||
QList<QmlItemNode> nodeList;
|
QList<QmlItemNode> nodeList;
|
||||||
nodeList.append(m_dragNode);
|
nodeList.append(m_dragNode);
|
||||||
|
@@ -87,6 +87,8 @@ void ImportManagerView::importsChanged(const QList<Import> &/*addedImports*/, co
|
|||||||
|
|
||||||
void ImportManagerView::possibleImportsChanged(const QList<Import> &/*possibleImports*/)
|
void ImportManagerView::possibleImportsChanged(const QList<Import> &/*possibleImports*/)
|
||||||
{
|
{
|
||||||
|
QmlDesignerPlugin::instance()->currentDesignDocument()->updateSubcomponentManager();
|
||||||
|
|
||||||
if (m_importsWidget)
|
if (m_importsWidget)
|
||||||
m_importsWidget->setPossibleImports(model()->possibleImports());
|
m_importsWidget->setPossibleImports(model()->possibleImports());
|
||||||
}
|
}
|
||||||
|
@@ -512,20 +512,18 @@ void ItemLibraryAssetImporter::finalizeQuick3DImport()
|
|||||||
addInfo(progressTitle);
|
addInfo(progressTitle);
|
||||||
notifyProgress(0, progressTitle);
|
notifyProgress(0, progressTitle);
|
||||||
|
|
||||||
// Trigger underlying qmljs snapshot update by making a non-change to the doc
|
|
||||||
model->rewriterView()->textModifier()->replace(0, 0, {});
|
|
||||||
|
|
||||||
// There is an inbuilt delay before rewriter change actually updates the data model,
|
// There is an inbuilt delay before rewriter change actually updates the data model,
|
||||||
// so we need to wait for a moment to allow the change to take effect.
|
// so we need to wait for a moment to allow the change to take effect.
|
||||||
// Otherwise subsequent subcomponent manager update won't detect new imports properly.
|
// Otherwise subsequent subcomponent manager update won't detect new imports properly.
|
||||||
QTimer *timer = new QTimer(parent());
|
QTimer *timer = new QTimer(parent());
|
||||||
static int counter;
|
static int counter;
|
||||||
counter = 0;
|
counter = 0;
|
||||||
timer->callOnTimeout([this, timer, progressTitle, doc]() {
|
timer->callOnTimeout([this, timer, progressTitle, model]() {
|
||||||
if (!isCancelled()) {
|
if (!isCancelled()) {
|
||||||
notifyProgress(++counter * 10, progressTitle);
|
notifyProgress(++counter * 10, progressTitle);
|
||||||
if (counter >= 10) {
|
if (counter >= 10) {
|
||||||
doc->updateSubcomponentManager();
|
// Trigger underlying qmljs snapshot update by making a non-change to the doc
|
||||||
|
model->rewriterView()->textModifier()->replace(0, 0, {});
|
||||||
timer->stop();
|
timer->stop();
|
||||||
notifyFinished();
|
notifyFinished();
|
||||||
}
|
}
|
||||||
|
@@ -39,6 +39,7 @@
|
|||||||
|
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QCursor>
|
#include <QCursor>
|
||||||
|
#include <QFontDatabase>
|
||||||
#include <QQmlContext>
|
#include <QQmlContext>
|
||||||
|
|
||||||
#include <coreplugin/icore.h>
|
#include <coreplugin/icore.h>
|
||||||
@@ -410,6 +411,12 @@ void PropertyEditorContextObject::restoreCursor()
|
|||||||
QApplication::restoreOverrideCursor();
|
QApplication::restoreOverrideCursor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QStringList PropertyEditorContextObject::styleNamesForFamily(const QString &family)
|
||||||
|
{
|
||||||
|
const QFontDatabase dataBase;
|
||||||
|
return dataBase.styles(family);
|
||||||
|
}
|
||||||
|
|
||||||
void EasingCurveEditor::registerDeclarativeType()
|
void EasingCurveEditor::registerDeclarativeType()
|
||||||
{
|
{
|
||||||
qmlRegisterType<EasingCurveEditor>("HelperWidgets", 2, 0, "EasingCurveEditor");
|
qmlRegisterType<EasingCurveEditor>("HelperWidgets", 2, 0, "EasingCurveEditor");
|
||||||
|
@@ -90,6 +90,8 @@ public:
|
|||||||
Q_INVOKABLE void hideCursor();
|
Q_INVOKABLE void hideCursor();
|
||||||
Q_INVOKABLE void restoreCursor();
|
Q_INVOKABLE void restoreCursor();
|
||||||
|
|
||||||
|
Q_INVOKABLE QStringList styleNamesForFamily(const QString &family);
|
||||||
|
|
||||||
int majorVersion() const;
|
int majorVersion() const;
|
||||||
int majorQtQuickVersion() const;
|
int majorQtQuickVersion() const;
|
||||||
int minorQtQuickVersion() const;
|
int minorQtQuickVersion() const;
|
||||||
|
@@ -53,16 +53,15 @@ def main():
|
|||||||
["Resources", "adding.qrc"],
|
["Resources", "adding.qrc"],
|
||||||
["QML", "example.qml"]]:
|
["QML", "example.qml"]]:
|
||||||
filenames = ["ABCD" + filename.upper(), "abcd" + filename.lower(), "test", "TEST", filename]
|
filenames = ["ABCD" + filename.upper(), "abcd" + filename.lower(), "test", "TEST", filename]
|
||||||
|
if filename.endswith(".h"):
|
||||||
|
filenames.remove("TEST")
|
||||||
if filename.endswith(".qrc"):
|
if filename.endswith(".qrc"):
|
||||||
filenames = ["ABCD" + filename.lower(), "abcd" + filename.lower(), filename]
|
filenames = ["ABCD" + filename.lower(), "abcd" + filename.lower(), filename]
|
||||||
previous = filenames[-1]
|
previous = filenames[-1]
|
||||||
for filename in filenames:
|
for filename in filenames:
|
||||||
tempFiletype = filetype
|
tempFiletype = filetype
|
||||||
if (filetype == "Resources" and previous in ("test", "TEST")
|
if filetype == "QML" and not previous.endswith(".qml"):
|
||||||
or filetype == "QML" and not previous.endswith(".qml")):
|
|
||||||
tempFiletype = "Other files"
|
tempFiletype = "Other files"
|
||||||
elif filetype == "Sources" and previous in ("test", "TEST"):
|
|
||||||
tempFiletype = "Headers"
|
|
||||||
renameFile(templateDir, usedProFile, projectName + "." + tempFiletype,
|
renameFile(templateDir, usedProFile, projectName + "." + tempFiletype,
|
||||||
previous, filename)
|
previous, filename)
|
||||||
# QTCREATORBUG-13176 does update the navigator async
|
# QTCREATORBUG-13176 does update the navigator async
|
||||||
@@ -114,7 +113,7 @@ def renameFile(projectDir, proFile, branch, oldname, newname):
|
|||||||
"Verify that file with new name exists: %s" % newFilePath)
|
"Verify that file with new name exists: %s" % newFilePath)
|
||||||
test.compare(readFile(newFilePath), oldFileText,
|
test.compare(readFile(newFilePath), oldFileText,
|
||||||
"Comparing content of file before and after renaming")
|
"Comparing content of file before and after renaming")
|
||||||
test.verify(waitFor("newname in safeReadFile(proFile)", 2000),
|
test.verify(waitFor("' ' + newname in safeReadFile(proFile)", 2000),
|
||||||
"Verify that new filename '%s' was added to pro-file." % newname)
|
"Verify that new filename '%s' was added to pro-file." % newname)
|
||||||
if oldname not in newname:
|
if oldname not in newname:
|
||||||
test.verify(oldname not in readFile(proFile),
|
test.verify(oldname not in readFile(proFile),
|
||||||
|