Merge remote-tracking branch 'origin/13.0' into qds/dev

Change-Id: Ief07ead0b4cf513c70bd74d4f5e28e4642edc78e
This commit is contained in:
Tim Jenssen
2024-05-17 19:55:06 +02:00
23 changed files with 128 additions and 71 deletions

View File

@@ -1,6 +1,6 @@
set(IDE_VERSION "13.0.1") # The IDE version. set(IDE_VERSION "13.0.2") # The IDE version.
set(IDE_VERSION_COMPAT "13.0.0") # The IDE Compatibility version. set(IDE_VERSION_COMPAT "13.0.0") # The IDE Compatibility version.
set(IDE_VERSION_DISPLAY "13.0.1") # The IDE display version. set(IDE_VERSION_DISPLAY "13.0.2") # The IDE display version.
set(IDE_COPYRIGHT_YEAR "2024") # The IDE current copyright year. set(IDE_COPYRIGHT_YEAR "2024") # The IDE current copyright year.
set(IDE_SETTINGSVARIANT "QtProject") # The IDE settings variation. set(IDE_SETTINGSVARIANT "QtProject") # The IDE settings variation.

View File

@@ -32,6 +32,7 @@ macro.QDV = "Qt Design Viewer"
macro.QL = "Qt Linguist" macro.QL = "Qt Linguist"
macro.QMCU = "Qt for MCUs" macro.QMCU = "Qt for MCUs"
macro.QMLD = "Qt Quick Designer" macro.QMLD = "Qt Quick Designer"
macro.QMLLS = "QML Language Server"
macro.QQV = "Qt QML Viewer" macro.QQV = "Qt QML Viewer"
macro.QSDK = "Qt" macro.QSDK = "Qt"
macro.QUL = "Qt Quick Ultralite" macro.QUL = "Qt Quick Ultralite"

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -62,7 +62,8 @@
\section1 Adding Language Servers \section1 Adding Language Servers
\QC adds a Python language server by default. \QC adds a \l{Configure Python language servers}{Python language server} by
default.
Also, it offers to install language servers for JSON and YAML files Also, it offers to install language servers for JSON and YAML files
when you open them in the editor if it can find the when you open them in the editor if it can find the
@@ -71,18 +72,22 @@
\image qtcreator-language-server-json.webp {Prompt to install JSON language server} \image qtcreator-language-server-json.webp {Prompt to install JSON language server}
Add a Java language server for \l{Connecting Android Devices} \l{Add a Java language server} for \l{Connecting Android Devices}
{Android development}. For other languages, add generic stdIO language {Android development}. For other languages,
servers. \l{Add generic language servers}{add generic stdIO language servers}.
To add language servers, go to \preferences > \uicontrol {Language Client} To add language servers, go to \preferences > \uicontrol {Language Client}
and select \uicontrol Add. and select \uicontrol Add.
\image qtcreator-language-client-options-java.png {Java language server preferences} \image qtcreator-language-client-options-java.png {Java language server preferences}
To enable a language server, select the check box next to the language To enable a language server, select the checkbox next to the language
server name and set server preferences. server name and set server preferences.
To turn on \l{Turn on \QMLLS}{\QMLLS}, go to
\preferences > \uicontrol {Qt Quick} > \uicontrol {QML/JS Editing} and
select \uicontrol {Enable \QMLLS}.
To remove language servers from the list, select \uicontrol Delete. To remove language servers from the list, select \uicontrol Delete.
\section1 Supported Locator Filters \section1 Supported Locator Filters
@@ -218,23 +223,23 @@
\ingroup creator-how-to-lsp \ingroup creator-how-to-lsp
\title Turn on QML Language Server \title Turn on \QMLLS
Since Qt 6.4, the QML language server offers code completion and Since Qt 6.4, \QMLLS offers code completion and
issues warnings for QML. To use it, go to \preferences > issues warnings for QML. To use it, go to \preferences >
\uicontrol {Qt Quick} > \uicontrol {QML/JS Editing} and select \uicontrol {Qt Quick} > \uicontrol {QML/JS Editing} and select
\uicontrol {Enable QML Language Server}. \uicontrol {Enable \QMLLS}.
By default, enabling the QML language server will only enable warning messages By default, enabling \QMLLS will only enable warning messages
and code completion, while advanced features such as renaming and finding usages and code completion, while advanced features such as renaming and finding usages
will be handled by the embedded code model. will be handled by the embedded code model.
To disable the embedded code model and use the QML language server for everything, To disable the embedded code model and use \QMLLS for everything,
select \uicontrol {Use QML Language Server advanced features}. select \uicontrol {Use \QMLLS advanced features}.
Also, \QC tries to use the QML language server shipped with Also, \QC tries to use \QMLLS shipped with
the Qt version in your current kit. To override that behavior and always use the the Qt version in your current kit. To override that behavior and always use
QML language server of the highest registered Qt version, select \QMLLS of the highest registered Qt version, select
\uicontrol {Use QML Language Server from latest Qt version}. \uicontrol {Use \QMLLS from latest Qt version}.
\image qtcreator-qml-js-editing.webp {QML/JS Editing preferences} \image qtcreator-qml-js-editing.webp {QML/JS Editing preferences}

View File

@@ -1,6 +1,10 @@
// 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://www.perforce.com/manuals/cmdref/Content/CmdRef/P4CONFIG.html
\title Perforce: P4CONFIG
*/
/*! /*!
\externalpage https://doc.qt.io/Boot2Qt/index.html \externalpage https://doc.qt.io/Boot2Qt/index.html
\title Boot2Qt: Documentation \title Boot2Qt: Documentation

View File

@@ -1,4 +1,4 @@
// Copyright (C) 2021 The Qt Company Ltd. // Copyright (C) 2024 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
// ********************************************************************** // **********************************************************************
@@ -50,10 +50,17 @@
the \uicontrol Boot2Qt tag (commercial only) in the search field the \uicontrol Boot2Qt tag (commercial only) in the search field
(4) to list examples that you can run on Boot2Qt devices. (4) to list examples that you can run on Boot2Qt devices.
\li In \uicontrol {Configure Project}, select
\l{glossary-buildandrun-kit}{kits} for building the example for the
target platforms.
\image qtcreator-configure-project.webp {Configure Project view}
\li Select \uicontrol {Configure Project}.
\li To check that you can compile and link the application code for a \li To check that you can compile and link the application code for a
device, click the \uicontrol {Kit Selector} and select a device, click the \uicontrol {Kit Selector} and select the kit for
\l{glossary-buildandrun-kit}{kit} for the the device.
device.
\image qtcreator-examples-kit-selector.webp {Selecting a kit to build with} \image qtcreator-examples-kit-selector.webp {Selecting a kit to build with}
@@ -61,7 +68,7 @@
automatically detected the installed kit. If you cannot see any kits, automatically detected the installed kit. If you cannot see any kits,
see \l{Add kits}. see \l{Add kits}.
\li Click \inlineimage icons/run_small.png \li Select \inlineimage icons/run_small.png
(\uicontrol Run) to build and run the application. (\uicontrol Run) to build and run the application.
\li To see the compilation progress, press \key{Alt+4} to open \li To see the compilation progress, press \key{Alt+4} to open
@@ -78,7 +85,7 @@
\endlist \endlist
\sa {Add compilers}, {Add kits}, {Add Qt versions}, \sa {Manage Kits}{How To: Manage Kits}, {Open projects},
{Connecting Android Devices}, {Connecting iOS Devices}, {Connecting Android Devices}, {Connecting iOS Devices},
{Compile Output}, {Boot2Qt: Documentation}, {Qt Design Studio Manual} {Compile Output}, {Boot2Qt: Documentation}, {Qt Design Studio Manual}
*/ */

View File

@@ -63,15 +63,15 @@
To re-configure projects: To re-configure projects:
\list 1 \list 1
\li In the \uicontrol {Configure Project} tab, select \li In \uicontrol {Configure Project}, select
\l{glossary-buildandrun-kit}{kits} for building \l{glossary-buildandrun-kit}{kits} for building
and running your project. and running your project.
\image qtcreator-open-project-kits.png {Configure Project tab} \image qtcreator-configure-project.webp {Configure Project view}
\li Select \uicontrol {Configure Project}. \li Select \uicontrol {Configure Project}.
\endlist \endlist
The \uicontrol {Configure Project} tab displays a list of kits that you \uicontrol {Configure Project} shows a list of kits that you
install on the development PC and configure in \preferences > \uicontrol Kits. install on the computer and configure in \preferences > \uicontrol Kits.
Even if you do not intend to build the project, the C++ and QML code models Even if you do not intend to build the project, the C++ and QML code models
need a Qt version and compiler to offer code completion. To specify them, need a Qt version and compiler to offer code completion. To specify them,

View File

@@ -35,11 +35,26 @@
Set workspace details in \uicontrol {P4 user}, \uicontrol {P4 client}, and Set workspace details in \uicontrol {P4 user}, \uicontrol {P4 client}, and
\uicontrol {P4 port}. \uicontrol {P4 port}.
To specify the details individually for several projects, use configuration \section1 Using Configuration Files
files instead. Create a \c {p4config.txt} configuration file for each
project in the top level project directory, and run To specify workspace details individually for several projects, use
\c{p4 set P4CONFIG=p4config.txt} once. You must deselect the configuration files:
\uicontrol {Environment Variables} check box.
\list 1
\li Create a \c {p4config.txt} configuration file for each project in the
top level project directory.
\li Go to \preferences > \uicontrol {Version Control} >
\uicontrol Perforce.
\li Clear \uicontrol {Environment Variables}.
\li To set \c P4CONFIG to use the file that you created, run the
following command from the command line once:
\badcode
p4 set P4CONFIG=p4config.txt
\endcode
\endlist
For more information about using the \c P4CONFIG variable, see
\l{Perforce: P4CONFIG}.
\section1 Editing Files \section1 Editing Files

View File

@@ -4,10 +4,10 @@ import qbs.FileInfo
import qbs.Utilities import qbs.Utilities
Module { Module {
property string qtcreator_display_version: '13.0.1' property string qtcreator_display_version: '13.0.2'
property string ide_version_major: '13' property string ide_version_major: '13'
property string ide_version_minor: '0' property string ide_version_minor: '0'
property string ide_version_release: '1' property string ide_version_release: '2'
property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.' property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.'
+ ide_version_release + ide_version_release

View File

@@ -50,8 +50,9 @@
*/ */
/*! /*!
\fn void ExtensionSystem::PluginView::pluginSettingsChanged(ExtensionSystem::PluginSpec *spec) \fn void ExtensionSystem::PluginView::pluginsChanged(const QSet<ExtensionSystem::PluginSpec *> &spec, bool enabled)
The settings for the plugin list entry corresponding to \a spec changed. The value of \a enabled for the plugin list entry corresponding to \a spec
changed.
*/ */
using namespace Utils; using namespace Utils;

View File

@@ -115,6 +115,17 @@ public:
their data, or use an ID, neither of these is mandatory. their data, or use an ID, neither of these is mandatory.
*/ */
/*!
\enum Utils::BaseAspect::Announcement
Whether to emit a signal when a value changes.
\value DoEmit
Emit a signal.
\value BeQuiet
Don't emit a signal.
*/
/*! /*!
Constructs a base aspect. Constructs a base aspect.
@@ -159,7 +170,9 @@ QVariant BaseAspect::variantValue() const
/*! /*!
Sets \a value. Sets \a value.
Prefer the typed setValue() of derived classes. If \a howToAnnounce is set to \c DoEmit, emits the \c valueChanged signal.
Prefer the typed \c setValue() of the derived classes.
*/ */
void BaseAspect::setVariantValue(const QVariant &value, Announcement howToAnnounce) void BaseAspect::setVariantValue(const QVariant &value, Announcement howToAnnounce)
{ {
@@ -939,9 +952,6 @@ public:
Based on QTextEdit, used for user-editable strings that often Based on QTextEdit, used for user-editable strings that often
do not fit on a line. do not fit on a line.
\value PathChooserDisplay
Based on Utils::PathChooser.
\value PasswordLineEditDisplay \value PasswordLineEditDisplay
Based on QLineEdit, used for password strings Based on QLineEdit, used for password strings
@@ -1416,7 +1426,10 @@ FilePath FilePathAspect::operator()() const
FilePath FilePathAspect::expandedValue() const FilePath FilePathAspect::expandedValue() const
{ {
return FilePath::fromUserInput(TypedAspect::value()); const auto value = TypedAspect::value();
if (!value.isEmpty() && d->m_expanderProvider)
return FilePath::fromUserInput(d->m_expanderProvider()->expand(value));
return FilePath::fromUserInput(value);
} }
QString FilePathAspect::value() const QString FilePathAspect::value() const
@@ -1425,7 +1438,9 @@ QString FilePathAspect::value() const
} }
/*! /*!
Sets the value of this file path aspect to \a value. Sets the value of this file path aspect to \a filePath.
If \a howToAnnounce is set to \c DoEmit, emits the \c valueChanged signal.
\note This does not use any check that the value is actually \note This does not use any check that the value is actually
a file path. a file path.
@@ -2781,8 +2796,8 @@ void IntegersAspect::addToLayout(Layouting::LayoutItem &parent)
*/ */
/*! /*!
Constructs a text display showing the \a message with an icon representing Constructs a text display with the parent \a container. The display shows
type \a type. \a message and an icon representing the type \a type.
*/ */
TextDisplay::TextDisplay(AspectContainer *container, const QString &message, InfoLabel::InfoType type) TextDisplay::TextDisplay(AspectContainer *container, const QString &message, InfoLabel::InfoType type)
: BaseAspect(container), d(new Internal::TextDisplayPrivate) : BaseAspect(container), d(new Internal::TextDisplayPrivate)

View File

@@ -190,8 +190,6 @@ expected_str<qint64> ProcessStubCreator::startStubProcess(const ProcessSetupData
process->setEnvironment( process->setEnvironment(
setupData.m_environment.appliedToEnvironment(Environment::systemEnvironment())); setupData.m_environment.appliedToEnvironment(Environment::systemEnvironment()));
process->setEnvironment(setupData.m_environment);
process->start(); process->start();
process->waitForStarted(); process->waitForStarted();
if (process->error() != QProcess::UnknownError) { if (process->error() != QProcess::UnknownError) {

View File

@@ -1002,7 +1002,7 @@ QAbstractItemModel *AndroidBuildApkStep::keystoreCertificates()
Process keytoolProc; Process keytoolProc;
keytoolProc.setCommand({androidConfig().keytoolPath(), params}); keytoolProc.setCommand({androidConfig().keytoolPath(), params});
using namespace std::chrono_literals; using namespace std::chrono_literals;
keytoolProc.runBlocking(30s, EventLoopMode::On); keytoolProc.runBlocking(30s);
if (keytoolProc.result() > ProcessResult::FinishedWithError) if (keytoolProc.result() > ProcessResult::FinishedWithError)
QMessageBox::critical(nullptr, Tr::tr("Error"), Tr::tr("Failed to run keytool.")); QMessageBox::critical(nullptr, Tr::tr("Error"), Tr::tr("Failed to run keytool."));
else else

View File

@@ -275,7 +275,7 @@ void AndroidCreateKeystoreCertificate::buttonBoxAccepted()
Process genKeyCertProc; Process genKeyCertProc;
genKeyCertProc.setCommand(command); genKeyCertProc.setCommand(command);
using namespace std::chrono_literals; using namespace std::chrono_literals;
genKeyCertProc.runBlocking(15s, EventLoopMode::On); genKeyCertProc.runBlocking(15s);
if (genKeyCertProc.result() != ProcessResult::FinishedWithSuccess) { if (genKeyCertProc.result() != ProcessResult::FinishedWithSuccess) {
QMessageBox::critical(this, Tr::tr("Error"), QMessageBox::critical(this, Tr::tr("Error"),

View File

@@ -614,7 +614,7 @@ bool checkKeystorePassword(const FilePath &keystorePath, const QString &keystore
"--storepass", keystorePasswd}); "--storepass", keystorePasswd});
Process proc; Process proc;
proc.setCommand(cmd); proc.setCommand(cmd);
proc.runBlocking(10s, EventLoopMode::On); proc.runBlocking(10s);
return proc.result() == ProcessResult::FinishedWithSuccess; return proc.result() == ProcessResult::FinishedWithSuccess;
} }
@@ -631,7 +631,7 @@ bool checkCertificatePassword(const FilePath &keystorePath, const QString &keyst
Process proc; Process proc;
proc.setCommand({androidConfig().keytoolPath(), arguments}); proc.setCommand({androidConfig().keytoolPath(), arguments});
proc.runBlocking(10s, EventLoopMode::On); proc.runBlocking(10s);
return proc.result() == ProcessResult::FinishedWithSuccess; return proc.result() == ProcessResult::FinishedWithSuccess;
} }
@@ -644,7 +644,7 @@ bool checkCertificateExists(const FilePath &keystorePath, const QString &keystor
Process proc; Process proc;
proc.setCommand({androidConfig().keytoolPath(), arguments}); proc.setCommand({androidConfig().keytoolPath(), arguments});
proc.runBlocking(10s, EventLoopMode::On); proc.runBlocking(10s);
return proc.result() == ProcessResult::FinishedWithSuccess; return proc.result() == ProcessResult::FinishedWithSuccess;
} }

View File

@@ -308,7 +308,8 @@ static CMakeBuildTarget toBuildTarget(const TargetDetails &t,
std::optional<QString> dllName; std::optional<QString> dllName;
if (buildDir.osType() == OsTypeWindows && (f.role == "libraries")) { if (buildDir.osType() == OsTypeWindows && (f.role == "libraries")) {
part = FilePath::fromUserInput(part).fileName(); const auto partAsFilePath = FilePath::fromUserInput(part);
part = partAsFilePath.fileName();
// Skip object libraries on Windows. This case can happen with static qml plugins // Skip object libraries on Windows. This case can happen with static qml plugins
if (part.endsWith(".obj") || part.endsWith(".o")) if (part.endsWith(".obj") || part.endsWith(".o"))
@@ -322,12 +323,15 @@ static CMakeBuildTarget toBuildTarget(const TargetDetails &t,
} }
// MinGW has libQt6Core.a -> Qt6Core.dll // MinGW has libQt6Core.a -> Qt6Core.dll
// but libFoo.dll.a was already handled above
const QString mingwPrefix("lib"); const QString mingwPrefix("lib");
const QString mingwSuffix(".a"); const QString mingwSuffix("a");
if (part.startsWith(mingwPrefix) && part.endsWith(mingwSuffix)) const QString completeSuffix = partAsFilePath.completeSuffix();
dllName = part.chopped(mingwSuffix.length()) if (part.startsWith(mingwPrefix) && completeSuffix == mingwSuffix) {
dllName = part.chopped(mingwSuffix.length() + 1/*the '.'*/)
.sliced(mingwPrefix.length()) .sliced(mingwPrefix.length())
.append(".dll"); .append(".dll");
}
} }
if (!tmp.isEmpty() && tmp.isDir()) { if (!tmp.isEmpty() && tmp.isDir()) {

View File

@@ -30,7 +30,7 @@ using namespace Utils;
and \uicontrol {Files in File System} where the user provides a directory and file and \uicontrol {Files in File System} where the user provides a directory and file
patterns to search. patterns to search.
\image qtcreator-search-filesystem.png \image qtcreator-search-reg-exp.webp {Search Results view with search criteria}
To make your find scope available to the user, you need to implement this To make your find scope available to the user, you need to implement this
class, and register an instance of your subclass in the plugin manager. class, and register an instance of your subclass in the plugin manager.
@@ -38,7 +38,7 @@ using namespace Utils;
A common way to present the search results to the user, is to use the A common way to present the search results to the user, is to use the
shared \uicontrol{Search Results} pane. shared \uicontrol{Search Results} pane.
\image qtcreator-search-results.webp {Search Results view} \image qtcreator-search-results-reg-exp.webp {Search Results view with search results}
If you want to implement a find filter that is doing a file based text If you want to implement a find filter that is doing a file based text
search, you should use \l Core::BaseTextFind, which already implements all search, you should use \l Core::BaseTextFind, which already implements all
@@ -178,13 +178,13 @@ using namespace Utils;
*/ */
/*! /*!
\fn void Core::IFindFilter::writeSettings(QSettings *settings) \fn void Core::IFindFilter::writeSettings(Utils::QtcSettings *settings)
Called at shutdown to write the state of the additional options Called at shutdown to write the state of the additional options
for this find filter to the \a settings. for this find filter to the \a settings.
*/ */
/*! /*!
\fn void Core::IFindFilter::readSettings(QSettings *settings) \fn void Core::IFindFilter::readSettings(Utils::QtcSettings *settings)
Called at startup to read the state of the additional options Called at startup to read the state of the additional options
for this find filter from the \a settings. for this find filter from the \a settings.
*/ */

View File

@@ -288,10 +288,13 @@ using namespace Core::Internal;
This enum type specifies whether the search results should be sorted or This enum type specifies whether the search results should be sorted or
ordered: ordered:
\value AddSorted \value AddSortedByContent
The search results are sorted. The search results are sorted alphabetically.
\value AddSortedByPosition
The search results are sorted by the search results' reported line
numbers.
\value AddOrdered \value AddOrdered
The search results are ordered. The search results are ordered as they are reported.
*/ */
/*! /*!
@@ -331,7 +334,7 @@ using namespace Core::Internal;
\brief The SearchResultWindow class is the implementation of a commonly \brief The SearchResultWindow class is the implementation of a commonly
shared \uicontrol{Search Results} output pane. shared \uicontrol{Search Results} output pane.
\image qtcreator-search-results.webp {Search Results view} \image qtcreator-search-results-reg-exp.webp {Search Results view with search results}
Whenever you want to show the user a list of search results, or want Whenever you want to show the user a list of search results, or want
to present UI for a global search and replace, use the single instance to present UI for a global search and replace, use the single instance

View File

@@ -103,7 +103,7 @@ bool QtDesignerFormClassCodeGenerator::generateCpp(const FormClassWizardParamete
Utils::writeIncludeFileDirective("QtGui/" + formBaseClass, true, headerStr); Utils::writeIncludeFileDirective("QtGui/" + formBaseClass, true, headerStr);
headerStr << "#endif\n"; headerStr << "#endif\n";
} else { } else {
Utils::writeIncludeFileDirective("QtGui/" + formBaseClass, true, headerStr); Utils::writeIncludeFileDirective("QtWidgets/" + formBaseClass, true, headerStr);
} }
} else { } else {
Utils::writeIncludeFileDirective(formBaseClass, true, headerStr); Utils::writeIncludeFileDirective(formBaseClass, true, headerStr);

View File

@@ -1512,7 +1512,8 @@ private:
const QString sshCmdLine = ProcessArgs::joinArgs( const QString sshCmdLine = ProcessArgs::joinArgs(
QStringList{SshSettings::sshFilePath().toUserOutput()} QStringList{SshSettings::sshFilePath().toUserOutput()}
<< fullConnectionOptions(), OsTypeLinux); << fullConnectionOptions(), OsTypeLinux);
QStringList options{"-e", sshCmdLine, m_setup.m_rsyncFlags}; QStringList options{"-e", sshCmdLine};
options << ProcessArgs::splitArgs(m_setup.m_rsyncFlags, HostOsInfo::hostOs());
if (!m_batches.isEmpty()) { // NormalRun if (!m_batches.isEmpty()) { // NormalRun
const auto batchIt = m_batches.begin(); const auto batchIt = m_batches.begin();

View File

@@ -48,12 +48,15 @@ def main():
snooze(1) snooze(1)
type(editor, ">") type(editor, ">")
snooze(1) snooze(1)
proposalExists = lambda: object.exists(':popupFrame_TextEditor::GenericProposalWidget')
nativeType("%s" % buttonName[0]) nativeType("%s" % buttonName[0])
test.verify(waitFor("object.exists(':popupFrame_TextEditor::GenericProposalWidget')", 1500), if test.verify(waitFor(proposalExists, 4000),
"Verify that GenericProposalWidget is being shown.") "Verify that GenericProposalWidget is being shown."):
nativeType("<Return>") nativeType("<Return>")
test.verify(waitFor('str(lineUnderCursor(editor)).strip() == "ui->%s" % buttonName', 1000), lineCorrect = lambda: str(lineUnderCursor(editor)).strip() == "ui->%s" % buttonName
'Comparing line "%s" to expected "%s"' % (lineUnderCursor(editor), "ui->%s" % buttonName)) test.verify(waitFor(lineCorrect, 1000),
('Comparing line "%s" to expected "%s"'
% (lineUnderCursor(editor), "ui->%s" % buttonName)))
type(editor, "<Shift+Delete>") # Delete line type(editor, "<Shift+Delete>") # Delete line
selectFromLocator("mainwindow.ui") selectFromLocator("mainwindow.ui")
saveAndExit() saveAndExit()