Merge remote-tracking branch 'origin/13.0'

Conflicts:
	doc/qtcreator/src/qtquick/qtquick-live-preview-devices.qdoc
	src/plugins/projectexplorer/projectexplorer.cpp

Change-Id: I682b330a278a329fc6294baeff6a28040abd10bc
This commit is contained in:
Eike Ziller
2024-04-22 12:18:10 +02:00
20 changed files with 81 additions and 74 deletions

View File

@@ -443,8 +443,8 @@
Performance Analyzer can read Perf data files generated in either frame Performance Analyzer can read Perf data files generated in either frame
pointer or dwarf mode. However, to generate the files correctly, numerous pointer or dwarf mode. However, to generate the files correctly, numerous
preconditions have to be met. All system images for the preconditions have to be met. All system images for the
\l{https://doc.qt.io/Boot2Qt/qtdc-supported-platforms.html} \l{Support Levels for Target Hardware}{supported embedded platforms}
{Boot2Qt:Supported Target Devices and Development Hosts} are correctly set are correctly set
up for profiling in the dwarf mode. For other devices, check whether Perf up for profiling in the dwarf mode. For other devices, check whether Perf
can read back its own data in a sensible way by checking the output of can read back its own data in a sensible way by checking the output of
\c {perf report} or \c {perf script} for the recorded Perf data files. \c {perf report} or \c {perf script} for the recorded Perf data files.

View File

@@ -1,6 +1,14 @@
// Copyright (C) 2022 The Qt Company Ltd. // Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\externalpage https://doc.qt.io/Boot2Qt/index.html
\title Boot2Qt: Documentation
*/
/*!
\externalpage https://doc.qt.io/Boot2Qt/b2qt-requirements-x11.html#setting-up-usb-access-to-embedded-devices
\title Boot2Qt: Setting Up USB Access to Embedded Devices
*/
/*! /*!
\externalpage https://doc.qt.io/qt/qtqml-index.html \externalpage https://doc.qt.io/qt/qtqml-index.html
\title Qt Qml \title Qt Qml

View File

@@ -47,8 +47,7 @@
\note On Ubuntu Linux, the development user account must have access to the \note On Ubuntu Linux, the development user account must have access to the
plugged-in devices. To grant them access to the device via USB, create a new plugged-in devices. To grant them access to the device via USB, create a new
\c udev rule, as described in \c udev rule, as described in
\l{https://doc.qt.io/Boot2Qt/b2qt-requirements-x11.html#setting-up-usb-access-to-embedded-devices} \l{Boot2Qt: Setting Up USB Access to Embedded Devices}.
{Boot2Qt: Setting Up USB Access to Embedded Devices}.
You can edit the settings later in \preferences > You can edit the settings later in \preferences >
\uicontrol Devices > \uicontrol Devices. \uicontrol Devices > \uicontrol Devices.
@@ -149,4 +148,6 @@
application files to the device. For more information, see application files to the device. For more information, see
\l{Boot2Qt Run Settings}. \l{Boot2Qt Run Settings}.
\endlist \endlist
\sa {Boot2Qt: Setting Up USB Access to Embedded Devices}
*/ */

View File

@@ -46,17 +46,11 @@
tools to customize the contents of the stack and to take it into tools to customize the contents of the stack and to take it into
production hardware. production hardware.
You need either Windows 10 64-bit or later or Ubuntu Linux 64-bit 20.04 LTS
or later to install and use Boot2Qt.
The following topics have more information about developing applications The following topics have more information about developing applications
for Boot2Qt devices: for Boot2Qt devices:
\list \list
\li \l{https://doc.qt.io/Boot2Qt/qtdc-supported-platforms.html} \li \l{Boot2Qt: Documentation}
{Boot2Qt: Supported Target Devices and Development Hosts}
\li \l{https://doc.qt.io/Boot2Qt/b2qt-installation-guides.html}
{Boot2Qt: Installation Guides}
\li \l{Connecting Boot2Qt Devices} \li \l{Connecting Boot2Qt Devices}
\li \l{Boot2Qt Run Settings} \li \l{Boot2Qt Run Settings}
\li \l{Boot2Qt Deploy Configuration} \li \l{Boot2Qt Deploy Configuration}

View File

@@ -28,8 +28,7 @@
To run an example application on a Boot2Qt device, you must set up To run an example application on a Boot2Qt device, you must set up
Boot2Qt on the development host and create connections Boot2Qt on the development host and create connections
between the host and devices. For more information, see between the host and devices. For more information, see
\l{https://doc.qt.io/Boot2Qt/b2qt-installation-guides.html} \l{Boot2Qt: Documentation}.
{Boot2Qt: Installation Guides}
If you have \l{Qt Design Studio Manual}{\QDS} installed, you can open If you have \l{Qt Design Studio Manual}{\QDS} installed, you can open
\QDS examples from \QC in \QDS. \QDS examples from \QC in \QDS.
@@ -70,9 +69,8 @@
If build errors occur, check that you have a Qt version, a If build errors occur, check that you have a Qt version, a
\l{Add compilers}{compiler}, and the necessary kits installed. If \l{Add compilers}{compiler}, and the necessary kits installed. If
you are building for an \l{Connecting Android Devices}{Android device} you are building for an Android or iOS device, check that you set up
or \l{Connecting iOS Devices}{iOS device}, check that you set up the the development environment correctly.
development environment correctly.
The \uicontrol Build progress bar on the toolbar turns green when The \uicontrol Build progress bar on the toolbar turns green when
you build the project successfully. The application opens on the you build the project successfully. The application opens on the
@@ -80,4 +78,7 @@
\endlist \endlist
\sa {Add compilers}, {Add kits}, {Add Qt versions},
{Connecting Android Devices}, {Connecting iOS Devices},
{Compile Output}, {Boot2Qt: Documentation}, {Qt Design Studio Manual}
*/ */

View File

@@ -27,9 +27,7 @@
\list \list
\li \l{Connecting Android Devices}{Android} \li \l{Connecting Android Devices}{Android}
\li \l{Connecting Bare Metal Devices}{Bare Metal} \li \l{Connecting Bare Metal Devices}{Bare Metal}
\li \l{https://doc.qt.io/Boot2Qt/b2qt-installation-guides.html} \li \l{Boot2Qt: Documentation}{Boot2Q} (commercial only)
{Boot2Qt} (commercial only)
\li \l{Emulator}{Boot2Qt Emulator} (commercial only)
\li \l{Adding Docker Devices}{Docker} (experimental) \li \l{Adding Docker Devices}{Docker} (experimental)
\li \l{Connecting iOS Devices}{iOS} \li \l{Connecting iOS Devices}{iOS}
\li iOS Simulator \li iOS Simulator
@@ -147,6 +145,9 @@
This setting is used to tell the code model which compiler is used. This setting is used to tell the code model which compiler is used.
If your project type and build tool support it, \QC also tells the If your project type and build tool support it, \QC also tells the
build tool to use this compiler for building the project. build tool to use this compiler for building the project.
\note qmake ignores the value of this field and fetches the compiler
information from \uicontrol {Qt mkspec}, which you can change.
\row \row
\li \uicontrol Environment \li \uicontrol Environment
\li Select \uicontrol Change to modify environment variable values for \li Select \uicontrol Change to modify environment variable values for

View File

@@ -8,10 +8,10 @@
\title Previewing on Devices \title Previewing on Devices
To preview UIs on Android devices, you need to enable USB debugging on them To preview UIs on Android devices, enable USB debugging on them
and connect them to your system with a USB cable. and connect them to your system with a USB cable.
To preview UIs on Boot2Qt devices, you need to connect the devices to your To preview UIs on Boot2Qt devices, connect the devices to your
system with a USB cable, or a wired or wireless connection, depending on system with a USB cable, or a wired or wireless connection, depending on
the device, and configure connections to them. The necessary kits have been the device, and configure connections to them. The necessary kits have been
predefined and you only need to enable them for your current project. predefined and you only need to enable them for your current project.
@@ -20,8 +20,8 @@
necessary files to a location in a device where you want to run the necessary files to a location in a device where you want to run the
executable at. executable at.
\note To preview on a wirelessly connected device, select \preferences > \uicontrol Devices \note To preview on a wirelessly connected device, go to \preferences >
and connect the device. \uicontrol Devices and connect the device.
To preview a UI on a device: To preview a UI on a device:
@@ -45,16 +45,16 @@
\section2 Previewing on Android Devices \section2 Previewing on Android Devices
\if defined(qtcreator) \if defined(qtcreator)
The USB debugging feature on Android devices enables creating connections With the USB debugging feature on Android devices, you can create connections
to the devices from \QDS and running the preview utility on them. to the devices from \QC and run the preview utility on them.
Debugging is enabled in different ways on different Android devices. Debugging is turned on in different ways on different Android devices.
Look for \uicontrol {USB Debugging} under \uicontrol {Developer Options}. Look for \uicontrol {USB Debugging} under \uicontrol {Developer Options}.
On some devices \uicontrol {Developer Options} is hidden and becomes visible On some devices, \uicontrol {Developer Options} is hidden and becomes visible
when you tap the \uicontrol {Build number} field in \uicontrol Settings > when you tap the \uicontrol {Build number} field in \uicontrol Settings >
\uicontrol About several times. \uicontrol About several times.
After you have enabled debugging, connect the Android device to the system After you turn on debugging, connect the Android device to the system
with a USB cable. with a USB cable.
The first time you preview a UI on devices, the preview utility The first time you preview a UI on devices, the preview utility
@@ -70,17 +70,8 @@
\section2 Previewing on Boot2Qt Devices \section2 Previewing on Boot2Qt Devices
You can preview UIs on Boot2Qt devices. For a list of supported devices, see You can preview UIs on supported Boot2Qt devices that you configure as
\l{https://doc.qt.io/Boot2Qt/qtdc-supported-platforms.html} instructed in the Boot2Qt documentation.
{Boot2Qt: Supported Target Devices and Development Hosts}.
You must configure the device as instructed in the \sa {Boot2Qt: Documentation}, {Support Levels for Target Hardware}
\l{https://doc.qt.io/Boot2Qt/b2qt-installation-guides.html}
{Boot2Qt: Installation Guides}.
\note At the time of this writing, \macos is not supported as a development
host for Boot2Qt. This means that you cannot preview UIs on
devices if you are using \QC on \macos. For more information, see
\l {https://doc.qt.io/Boot2Qt/qtdc-supported-platforms.html#supported-development-hosts}
{Boot2Qt: Supported Development Hosts}.
*/ */

View File

@@ -1,12 +1,12 @@
{ {
"common": { "common": {
"sdk_tools_url": { "sdk_tools_url": {
"linux": "https://dl.google.com/android/repository/commandlinetools-linux-9123335_latest.zip", "linux": "https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip",
"linux_sha256": "0bebf59339eaa534f4217f8aa0972d14dc49e7207be225511073c661ae01da0a", "linux_sha256": "2d2d50857e4eb553af5a6dc3ad507a17adf43d115264b1afc116f95c92e5e258",
"windows": "https://dl.google.com/android/repository/commandlinetools-win-9123335_latest.zip", "windows": "https://dl.google.com/android/repository/commandlinetools-win-11076708_latest.zip",
"windows_sha256": "8a90e6a3deb2fa13229b2e335efd07687dcc8a55a3c544da9f40b41404993e7d", "windows_sha256": "4d6931209eebb1bfb7c7e8b240a6a3cb3ab24479ea294f3539429574b1eec862",
"mac": "https://dl.google.com/android/repository/commandlinetools-mac-9123335_latest.zip", "mac": "https://dl.google.com/android/repository/commandlinetools-mac-11076708_latest.zip",
"mac_sha256": "d0192807f7e1cd4a001d13bb1e5904fc287b691211648877258aa44d1fa88275" "mac_sha256": "7bc5c72ba0275c80a8f19684fb92793b83a6b5c94d4d179fc5988930282d7e64"
}, },
"sdk_essential_packages": { "sdk_essential_packages": {
"default": ["platform-tools", "platforms;android-31", "cmdline-tools;latest"], "default": ["platform-tools", "platforms;android-31", "cmdline-tools;latest"],

View File

@@ -769,6 +769,7 @@ private:
std::unique_ptr<ProcessInterfaceHandler> m_processHandler; std::unique_ptr<ProcessInterfaceHandler> m_processHandler;
mutable QMutex m_mutex; mutable QMutex m_mutex;
QList<ProcessInterfaceSignal *> m_signals; QList<ProcessInterfaceSignal *> m_signals;
Guard m_guard;
}; };
class ProcessPrivate : public QObject class ProcessPrivate : public QObject
@@ -961,6 +962,10 @@ GeneralProcessBlockingImpl::GeneralProcessBlockingImpl(ProcessPrivate *parent)
bool GeneralProcessBlockingImpl::waitForSignal(ProcessSignalType newSignal, QDeadlineTimer timeout) bool GeneralProcessBlockingImpl::waitForSignal(ProcessSignalType newSignal, QDeadlineTimer timeout)
{ {
QTC_ASSERT(!m_guard.isLocked(), qWarning("Process::waitForSignal() called recursively. "
"The call is being ignored."); return false);
GuardLocker locker(m_guard);
m_processHandler->setParent(nullptr); m_processHandler->setParent(nullptr);
QThread thread; QThread thread;

View File

@@ -125,10 +125,8 @@ static void sdkManagerCommand(const AndroidConfig &config, const QStringList &ar
bool assertionFound = false; bool assertionFound = false;
proc.setStdOutCallback([offset, progressQuota, &proc, &assertionFound, &promise](const QString &out) { proc.setStdOutCallback([offset, progressQuota, &proc, &assertionFound, &promise](const QString &out) {
int progressPercent = parseProgress(out, assertionFound); int progressPercent = parseProgress(out, assertionFound);
if (assertionFound) { if (assertionFound)
proc.stop(); proc.stop();
proc.waitForFinished();
}
if (progressPercent != -1) if (progressPercent != -1)
promise.setProgressValue(offset + qRound((progressPercent / 100.0) * progressQuota)); promise.setProgressValue(offset + qRound((progressPercent / 100.0) * progressQuota));
}); });

View File

@@ -701,7 +701,7 @@ static void addCompileGroups(ProjectNode *targetRoot,
node->setIsGenerated(true); node->setIsGenerated(true);
const bool showSourceFolders = settings().showSourceSubFolders() const bool showSourceFolders = settings().showSourceSubFolders()
&& sourcesOrHeadersFolder(td.sourceGroups[si.sourceGroup]); && defaultCMakeSourceGroupFolder(td.sourceGroups[si.sourceGroup]);
// Where does the file node need to go? // Where does the file node need to go?
if (showSourceFolders && sourcePath.isChildOf(buildDirectory) && !inSourceBuild) { if (showSourceFolders && sourcePath.isChildOf(buildDirectory) && !inSourceBuild) {
@@ -715,7 +715,7 @@ static void addCompileGroups(ProjectNode *targetRoot,
for (size_t i = 0; i < sourceGroupFileNodes.size(); ++i) { for (size_t i = 0; i < sourceGroupFileNodes.size(); ++i) {
const bool showSourceFolders = settings().showSourceSubFolders() const bool showSourceFolders = settings().showSourceSubFolders()
&& sourcesOrHeadersFolder(td.sourceGroups[i]); && defaultCMakeSourceGroupFolder(td.sourceGroups[i]);
std::vector<std::unique_ptr<FileNode>> &current = sourceGroupFileNodes[i]; std::vector<std::unique_ptr<FileNode>> &current = sourceGroupFileNodes[i];
FolderNode *insertNode = td.sourceGroups[i] == "TREE" FolderNode *insertNode = td.sourceGroups[i] == "TREE"

View File

@@ -18,9 +18,12 @@ using namespace ProjectExplorer;
namespace CMakeProjectManager::Internal { namespace CMakeProjectManager::Internal {
bool sourcesOrHeadersFolder(const QString &displayName) bool defaultCMakeSourceGroupFolder(const QString &displayName)
{ {
return displayName == "Source Files" || displayName == "Header Files"; return displayName == "Source Files" || displayName == "Header Files"
|| displayName == "Resources" || displayName == ""
|| displayName == "Precompile Header File" || displayName == "CMake Rules"
|| displayName == "Object Files";
} }
std::unique_ptr<FolderNode> createCMakeVFolder(const Utils::FilePath &basePath, std::unique_ptr<FolderNode> createCMakeVFolder(const Utils::FilePath &basePath,
@@ -30,7 +33,7 @@ std::unique_ptr<FolderNode> createCMakeVFolder(const Utils::FilePath &basePath,
auto newFolder = std::make_unique<VirtualFolderNode>(basePath); auto newFolder = std::make_unique<VirtualFolderNode>(basePath);
newFolder->setPriority(priority); newFolder->setPriority(priority);
newFolder->setDisplayName(displayName); newFolder->setDisplayName(displayName);
newFolder->setIsSourcesOrHeaders(sourcesOrHeadersFolder(displayName)); newFolder->setIsSourcesOrHeaders(defaultCMakeSourceGroupFolder(displayName));
return newFolder; return newFolder;
} }

View File

@@ -11,7 +11,7 @@
namespace CMakeProjectManager::Internal { namespace CMakeProjectManager::Internal {
bool sourcesOrHeadersFolder(const QString &displayName); bool defaultCMakeSourceGroupFolder(const QString &displayName);
std::unique_ptr<ProjectExplorer::FolderNode> createCMakeVFolder(const Utils::FilePath &basePath, std::unique_ptr<ProjectExplorer::FolderNode> createCMakeVFolder(const Utils::FilePath &basePath,
int priority, int priority,

View File

@@ -100,10 +100,10 @@ DebuggerRunConfigurationAspect::DebuggerRunConfigurationAspect(Target *target)
}; };
setSummaryText(); setSummaryText();
connect(&m_cppAspect, &BaseAspect::changed, this, setSummaryText); connect(&m_cppAspect, &BaseAspect::changed, details, setSummaryText);
connect(&m_qmlAspect, &BaseAspect::changed, this, setSummaryText); connect(&m_qmlAspect, &BaseAspect::changed, details, setSummaryText);
connect(&m_pythonAspect, &BaseAspect::changed, this, setSummaryText); connect(&m_pythonAspect, &BaseAspect::changed, details, setSummaryText);
connect(&m_overrideStartupAspect, &BaseAspect::changed, this, setSummaryText); connect(&m_overrideStartupAspect, &BaseAspect::changed, details, setSummaryText);
return details; return details;
}); });

View File

@@ -53,7 +53,8 @@ const char ABORT_BUILD_ALL_ON_ERROR_SETTINGS_KEY[]
= "ProjectExplorer/Settings/AbortBuildAllOnError"; = "ProjectExplorer/Settings/AbortBuildAllOnError";
const char LOW_BUILD_PRIORITY_SETTINGS_KEY[] = "ProjectExplorer/Settings/LowBuildPriority"; const char LOW_BUILD_PRIORITY_SETTINGS_KEY[] = "ProjectExplorer/Settings/LowBuildPriority";
const char APP_ENV_CHANGES_SETTINGS_KEY[] = "ProjectExplorer/Settings/AppEnvChanges"; const char APP_ENV_CHANGES_SETTINGS_KEY[] = "ProjectExplorer/Settings/AppEnvChanges";
const char WARN_AGAINST_NON_ASCII_BUILD_DIR_SETTINGS_KEY[] = "ProjectExplorer/Settings/LowBuildPriority"; const char WARN_AGAINST_NON_ASCII_BUILD_DIR_SETTINGS_KEY[]
= "ProjectExplorer/Settings/WarnAgainstNonAsciiBuildDir";
} // Constants } // Constants

View File

@@ -81,6 +81,14 @@ def selectFromCombo(objectSpec, itemName):
mouseClick(waitForObjectItem(comboObject, itemName.replace(".", "\\."))) mouseClick(waitForObjectItem(comboObject, itemName.replace(".", "\\.")))
test.verify(waitFor("str(comboObject.currentText)==itemName", 5000), test.verify(waitFor("str(comboObject.currentText)==itemName", 5000),
"Switched combo item to '%s'" % itemName) "Switched combo item to '%s'" % itemName)
def __collapsed__():
try:
waitForObject("{container='%s' type='QModelIndex'}" % objectSpec, 100)
return False
except:
return True
waitFor(__collapsed__, 1000)
return True return True
def selectFromLocator(filter, itemName = None): def selectFromLocator(filter, itemName = None):

View File

@@ -53,10 +53,6 @@ def checkQtCreatorHelpVersion(expectedVersion):
test.fail("Missing Qt Creator Manual.") test.fail("Missing Qt Creator Manual.")
def _shortcutMatches_(shortcutEdit, expectedText):
return str(findObject(shortcutEdit).text) == expectedText
def setKeyboardShortcutForAboutQtC(): def setKeyboardShortcutForAboutQtC():
invokeMenuItem("Edit", "Preferences...") invokeMenuItem("Edit", "Preferences...")
mouseClick(waitForObjectItem(":Options_QListView", "Environment")) mouseClick(waitForObjectItem(":Options_QListView", "Environment"))
@@ -78,16 +74,16 @@ def setKeyboardShortcutForAboutQtC():
"placeholderText='Enter key sequence as text'}" % shortcutGB) "placeholderText='Enter key sequence as text'}" % shortcutGB)
clickButton(record) clickButton(record)
nativeType(keysToType) nativeType(keysToType)
waitFor("_shortcutMatches_(shortcut, expectedKeys)", 5000) waitFor(lambda: str(findObject(shortcut).text) == expectedKeys, 5000)
clickButton(record) clickButton(record)
gotExpectedShortcut = _shortcutMatches_(shortcut, expectedKeys) foundShortcut = str(findObject(shortcut).text)
if not gotExpectedShortcut and platform.system() == 'Darwin': if foundShortcut != expectedKeys and platform.system() == 'Darwin':
test.warning("Squish Issue: shortcut was set to %s - entering it manually now" test.warning("Squish Issue: shortcut was set to %s - entering it manually now"
% waitForObject(shortcut).text) % waitForObject(shortcut).text)
replaceEditorContent(shortcut, expectedKeys) replaceEditorContent(shortcut, expectedKeys)
else: else:
test.verify(gotExpectedShortcut, "Expected key sequence is displayed.") test.compare(foundShortcut, expectedKeys, "Expected key sequence is displayed?")
clickButton(waitForObject(":Options.OK_QPushButton")) clickButton(waitForObject(":Options.OK_QPushButton"))
def main(): def main():

View File

@@ -41,9 +41,6 @@ def main():
# needed because categoriesView and templatesView using same model # needed because categoriesView and templatesView using same model
for template in dumpItems(templatesView.model(), templatesView.rootIndex()): for template in dumpItems(templatesView.model(), templatesView.rootIndex()):
template = template.replace(".", "\\.") template = template.replace(".", "\\.")
# FIXME this needs Qt6.2+
if template == "Qt Quick 2 Extension Plugin":
continue
# skip non-configurable # skip non-configurable
if template not in ["Qt Quick UI Prototype", "Qt Creator Plugin"]: if template not in ["Qt Quick UI Prototype", "Qt Creator Plugin"]:
availableProjectTypes.append({category:template}) availableProjectTypes.append({category:template})
@@ -119,6 +116,9 @@ def handleBuildSystemVerifyKits(category, template, kits, displayedPlatforms,
if template == 'Qt Quick Application': if template == 'Qt Quick Application':
fixedBuildSystems.remove('qmake') fixedBuildSystems.remove('qmake')
test.log("Skipped qmake (not supported).") test.log("Skipped qmake (not supported).")
elif template == 'Qt Quick 2 Extension Plugin':
fixedBuildSystems.remove('Qbs')
test.log("Skipped Qbs (not supported).")
for counter, buildSystem in enumerate(fixedBuildSystems): for counter, buildSystem in enumerate(fixedBuildSystems):
test.log("Using build system '%s'" % buildSystem) test.log("Using build system '%s'" % buildSystem)

View File

@@ -21,13 +21,13 @@ def main():
openQmakeProject(os.path.join(pathSpeedcrunch, "src", "speedcrunch.pro"), openQmakeProject(os.path.join(pathSpeedcrunch, "src", "speedcrunch.pro"),
[Targets.DESKTOP_5_14_1_DEFAULT]) [Targets.DESKTOP_5_14_1_DEFAULT])
# Wait for parsing to complete # Wait for parsing to complete
waitFor("runButton.enabled", 30000) waitFor(lambda: runButton.enabled, 30000)
# Starting before opening, because this is where Creator froze (QTCREATORBUG-10733) # Starting before opening, because this is where Creator froze (QTCREATORBUG-10733)
startopening = datetime.utcnow() startopening = datetime.utcnow()
openQmakeProject(pathCreator, [Targets.DESKTOP_5_14_1_DEFAULT]) openQmakeProject(pathCreator, [Targets.DESKTOP_5_14_1_DEFAULT])
# Wait for parsing to complete # Wait for parsing to complete
startreading = datetime.utcnow() startreading = datetime.utcnow()
waitFor("runButton.enabled", 300000) waitFor(lambda: runButton.enabled, 300000)
secondsOpening = (datetime.utcnow() - startopening).seconds secondsOpening = (datetime.utcnow() - startopening).seconds
secondsReading = (datetime.utcnow() - startreading).seconds secondsReading = (datetime.utcnow() - startreading).seconds
timeoutOpen = 45 timeoutOpen = 45