forked from qt-creator/qt-creator
Merge remote-tracking branch 'origin/13.0' into qds/dev
Change-Id: Ief07ead0b4cf513c70bd74d4f5e28e4642edc78e
This commit is contained in:
@@ -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_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_SETTINGSVARIANT "QtProject") # The IDE settings variation.
|
||||
|
@@ -32,6 +32,7 @@ macro.QDV = "Qt Design Viewer"
|
||||
macro.QL = "Qt Linguist"
|
||||
macro.QMCU = "Qt for MCUs"
|
||||
macro.QMLD = "Qt Quick Designer"
|
||||
macro.QMLLS = "QML Language Server"
|
||||
macro.QQV = "Qt QML Viewer"
|
||||
macro.QSDK = "Qt"
|
||||
macro.QUL = "Qt Quick Ultralite"
|
||||
|
BIN
doc/qtcreator/images/qtcreator-configure-project.webp
Normal file
BIN
doc/qtcreator/images/qtcreator-configure-project.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.2 KiB |
Binary file not shown.
Before Width: | Height: | Size: 11 KiB |
@@ -62,7 +62,8 @@
|
||||
|
||||
\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
|
||||
when you open them in the editor if it can find the
|
||||
@@ -71,9 +72,9 @@
|
||||
|
||||
\image qtcreator-language-server-json.webp {Prompt to install JSON language server}
|
||||
|
||||
Add a Java language server for \l{Connecting Android Devices}
|
||||
{Android development}. For other languages, add generic stdIO language
|
||||
servers.
|
||||
\l{Add a Java language server} for \l{Connecting Android Devices}
|
||||
{Android development}. For other languages,
|
||||
\l{Add generic language servers}{add generic stdIO language servers}.
|
||||
|
||||
To add language servers, go to \preferences > \uicontrol {Language Client}
|
||||
and select \uicontrol Add.
|
||||
@@ -83,6 +84,10 @@
|
||||
To enable a language server, select the checkbox next to the language
|
||||
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.
|
||||
|
||||
\section1 Supported Locator Filters
|
||||
@@ -218,23 +223,23 @@
|
||||
|
||||
\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 >
|
||||
\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
|
||||
will be handled by the embedded code model.
|
||||
To disable the embedded code model and use the QML language server for everything,
|
||||
select \uicontrol {Use QML Language Server advanced features}.
|
||||
To disable the embedded code model and use \QMLLS for everything,
|
||||
select \uicontrol {Use \QMLLS advanced features}.
|
||||
|
||||
Also, \QC tries to use the QML language server shipped with
|
||||
the Qt version in your current kit. To override that behavior and always use the
|
||||
QML language server of the highest registered Qt version, select
|
||||
\uicontrol {Use QML Language Server from latest Qt version}.
|
||||
Also, \QC tries to use \QMLLS shipped with
|
||||
the Qt version in your current kit. To override that behavior and always use
|
||||
\QMLLS of the highest registered Qt version, select
|
||||
\uicontrol {Use \QMLLS from latest Qt version}.
|
||||
|
||||
\image qtcreator-qml-js-editing.webp {QML/JS Editing preferences}
|
||||
|
||||
|
@@ -1,6 +1,10 @@
|
||||
// Copyright (C) 2022 The Qt Company Ltd.
|
||||
// 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
|
||||
\title Boot2Qt: Documentation
|
||||
|
@@ -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
|
||||
|
||||
// **********************************************************************
|
||||
@@ -50,10 +50,17 @@
|
||||
the \uicontrol Boot2Qt tag (commercial only) in the search field
|
||||
(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
|
||||
device, click the \uicontrol {Kit Selector} and select a
|
||||
\l{glossary-buildandrun-kit}{kit} for the
|
||||
device.
|
||||
device, click the \uicontrol {Kit Selector} and select the kit for
|
||||
the device.
|
||||
|
||||
\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,
|
||||
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.
|
||||
|
||||
\li To see the compilation progress, press \key{Alt+4} to open
|
||||
@@ -78,7 +85,7 @@
|
||||
|
||||
\endlist
|
||||
|
||||
\sa {Add compilers}, {Add kits}, {Add Qt versions},
|
||||
\sa {Manage Kits}{How To: Manage Kits}, {Open projects},
|
||||
{Connecting Android Devices}, {Connecting iOS Devices},
|
||||
{Compile Output}, {Boot2Qt: Documentation}, {Qt Design Studio Manual}
|
||||
*/
|
||||
|
@@ -63,15 +63,15 @@
|
||||
To re-configure projects:
|
||||
|
||||
\list 1
|
||||
\li In the \uicontrol {Configure Project} tab, select
|
||||
\li In \uicontrol {Configure Project}, select
|
||||
\l{glossary-buildandrun-kit}{kits} for building
|
||||
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}.
|
||||
\endlist
|
||||
|
||||
The \uicontrol {Configure Project} tab displays a list of kits that you
|
||||
install on the development PC and configure in \preferences > \uicontrol Kits.
|
||||
\uicontrol {Configure Project} shows a list of kits that you
|
||||
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
|
||||
need a Qt version and compiler to offer code completion. To specify them,
|
||||
|
@@ -35,11 +35,26 @@
|
||||
Set workspace details in \uicontrol {P4 user}, \uicontrol {P4 client}, and
|
||||
\uicontrol {P4 port}.
|
||||
|
||||
To specify the details individually for several projects, use configuration
|
||||
files instead. Create a \c {p4config.txt} configuration file for each
|
||||
project in the top level project directory, and run
|
||||
\c{p4 set P4CONFIG=p4config.txt} once. You must deselect the
|
||||
\uicontrol {Environment Variables} check box.
|
||||
\section1 Using Configuration Files
|
||||
|
||||
To specify workspace details individually for several projects, use
|
||||
configuration files:
|
||||
|
||||
\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
|
||||
|
||||
|
@@ -4,10 +4,10 @@ import qbs.FileInfo
|
||||
import qbs.Utilities
|
||||
|
||||
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_minor: '0'
|
||||
property string ide_version_release: '1'
|
||||
property string ide_version_release: '2'
|
||||
property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.'
|
||||
+ ide_version_release
|
||||
|
||||
|
@@ -50,8 +50,9 @@
|
||||
*/
|
||||
|
||||
/*!
|
||||
\fn void ExtensionSystem::PluginView::pluginSettingsChanged(ExtensionSystem::PluginSpec *spec)
|
||||
The settings for the plugin list entry corresponding to \a spec changed.
|
||||
\fn void ExtensionSystem::PluginView::pluginsChanged(const QSet<ExtensionSystem::PluginSpec *> &spec, bool enabled)
|
||||
The value of \a enabled for the plugin list entry corresponding to \a spec
|
||||
changed.
|
||||
*/
|
||||
|
||||
using namespace Utils;
|
||||
|
@@ -115,6 +115,17 @@ public:
|
||||
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.
|
||||
|
||||
@@ -159,7 +170,9 @@ QVariant BaseAspect::variantValue() const
|
||||
/*!
|
||||
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)
|
||||
{
|
||||
@@ -939,9 +952,6 @@ public:
|
||||
Based on QTextEdit, used for user-editable strings that often
|
||||
do not fit on a line.
|
||||
|
||||
\value PathChooserDisplay
|
||||
Based on Utils::PathChooser.
|
||||
|
||||
\value PasswordLineEditDisplay
|
||||
Based on QLineEdit, used for password strings
|
||||
|
||||
@@ -1416,7 +1426,10 @@ FilePath FilePathAspect::operator()() 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
|
||||
@@ -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
|
||||
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
|
||||
type \a type.
|
||||
Constructs a text display with the parent \a container. The display shows
|
||||
\a message and an icon representing the type \a type.
|
||||
*/
|
||||
TextDisplay::TextDisplay(AspectContainer *container, const QString &message, InfoLabel::InfoType type)
|
||||
: BaseAspect(container), d(new Internal::TextDisplayPrivate)
|
||||
|
@@ -190,8 +190,6 @@ expected_str<qint64> ProcessStubCreator::startStubProcess(const ProcessSetupData
|
||||
process->setEnvironment(
|
||||
setupData.m_environment.appliedToEnvironment(Environment::systemEnvironment()));
|
||||
|
||||
process->setEnvironment(setupData.m_environment);
|
||||
|
||||
process->start();
|
||||
process->waitForStarted();
|
||||
if (process->error() != QProcess::UnknownError) {
|
||||
|
@@ -1002,7 +1002,7 @@ QAbstractItemModel *AndroidBuildApkStep::keystoreCertificates()
|
||||
Process keytoolProc;
|
||||
keytoolProc.setCommand({androidConfig().keytoolPath(), params});
|
||||
using namespace std::chrono_literals;
|
||||
keytoolProc.runBlocking(30s, EventLoopMode::On);
|
||||
keytoolProc.runBlocking(30s);
|
||||
if (keytoolProc.result() > ProcessResult::FinishedWithError)
|
||||
QMessageBox::critical(nullptr, Tr::tr("Error"), Tr::tr("Failed to run keytool."));
|
||||
else
|
||||
|
@@ -275,7 +275,7 @@ void AndroidCreateKeystoreCertificate::buttonBoxAccepted()
|
||||
Process genKeyCertProc;
|
||||
genKeyCertProc.setCommand(command);
|
||||
using namespace std::chrono_literals;
|
||||
genKeyCertProc.runBlocking(15s, EventLoopMode::On);
|
||||
genKeyCertProc.runBlocking(15s);
|
||||
|
||||
if (genKeyCertProc.result() != ProcessResult::FinishedWithSuccess) {
|
||||
QMessageBox::critical(this, Tr::tr("Error"),
|
||||
|
@@ -614,7 +614,7 @@ bool checkKeystorePassword(const FilePath &keystorePath, const QString &keystore
|
||||
"--storepass", keystorePasswd});
|
||||
Process proc;
|
||||
proc.setCommand(cmd);
|
||||
proc.runBlocking(10s, EventLoopMode::On);
|
||||
proc.runBlocking(10s);
|
||||
return proc.result() == ProcessResult::FinishedWithSuccess;
|
||||
}
|
||||
|
||||
@@ -631,7 +631,7 @@ bool checkCertificatePassword(const FilePath &keystorePath, const QString &keyst
|
||||
|
||||
Process proc;
|
||||
proc.setCommand({androidConfig().keytoolPath(), arguments});
|
||||
proc.runBlocking(10s, EventLoopMode::On);
|
||||
proc.runBlocking(10s);
|
||||
return proc.result() == ProcessResult::FinishedWithSuccess;
|
||||
}
|
||||
|
||||
@@ -644,7 +644,7 @@ bool checkCertificateExists(const FilePath &keystorePath, const QString &keystor
|
||||
|
||||
Process proc;
|
||||
proc.setCommand({androidConfig().keytoolPath(), arguments});
|
||||
proc.runBlocking(10s, EventLoopMode::On);
|
||||
proc.runBlocking(10s);
|
||||
return proc.result() == ProcessResult::FinishedWithSuccess;
|
||||
}
|
||||
|
||||
|
@@ -308,7 +308,8 @@ static CMakeBuildTarget toBuildTarget(const TargetDetails &t,
|
||||
|
||||
std::optional<QString> dllName;
|
||||
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
|
||||
if (part.endsWith(".obj") || part.endsWith(".o"))
|
||||
@@ -322,13 +323,16 @@ static CMakeBuildTarget toBuildTarget(const TargetDetails &t,
|
||||
}
|
||||
|
||||
// MinGW has libQt6Core.a -> Qt6Core.dll
|
||||
// but libFoo.dll.a was already handled above
|
||||
const QString mingwPrefix("lib");
|
||||
const QString mingwSuffix(".a");
|
||||
if (part.startsWith(mingwPrefix) && part.endsWith(mingwSuffix))
|
||||
dllName = part.chopped(mingwSuffix.length())
|
||||
const QString mingwSuffix("a");
|
||||
const QString completeSuffix = partAsFilePath.completeSuffix();
|
||||
if (part.startsWith(mingwPrefix) && completeSuffix == mingwSuffix) {
|
||||
dllName = part.chopped(mingwSuffix.length() + 1/*the '.'*/)
|
||||
.sliced(mingwPrefix.length())
|
||||
.append(".dll");
|
||||
}
|
||||
}
|
||||
|
||||
if (!tmp.isEmpty() && tmp.isDir()) {
|
||||
// f.role is libraryPath or frameworkPath
|
||||
|
@@ -30,7 +30,7 @@ using namespace Utils;
|
||||
and \uicontrol {Files in File System} where the user provides a directory and file
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
for this find filter from the \a settings.
|
||||
*/
|
||||
|
@@ -288,10 +288,13 @@ using namespace Core::Internal;
|
||||
This enum type specifies whether the search results should be sorted or
|
||||
ordered:
|
||||
|
||||
\value AddSorted
|
||||
The search results are sorted.
|
||||
\value AddSortedByContent
|
||||
The search results are sorted alphabetically.
|
||||
\value AddSortedByPosition
|
||||
The search results are sorted by the search results' reported line
|
||||
numbers.
|
||||
\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
|
||||
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
|
||||
to present UI for a global search and replace, use the single instance
|
||||
|
@@ -103,7 +103,7 @@ bool QtDesignerFormClassCodeGenerator::generateCpp(const FormClassWizardParamete
|
||||
Utils::writeIncludeFileDirective("QtGui/" + formBaseClass, true, headerStr);
|
||||
headerStr << "#endif\n";
|
||||
} else {
|
||||
Utils::writeIncludeFileDirective("QtGui/" + formBaseClass, true, headerStr);
|
||||
Utils::writeIncludeFileDirective("QtWidgets/" + formBaseClass, true, headerStr);
|
||||
}
|
||||
} else {
|
||||
Utils::writeIncludeFileDirective(formBaseClass, true, headerStr);
|
||||
|
@@ -1512,7 +1512,8 @@ private:
|
||||
const QString sshCmdLine = ProcessArgs::joinArgs(
|
||||
QStringList{SshSettings::sshFilePath().toUserOutput()}
|
||||
<< 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
|
||||
const auto batchIt = m_batches.begin();
|
||||
|
Submodule src/shared/qbs updated: 488fbe40e8...1ee1e51fa9
@@ -48,12 +48,15 @@ def main():
|
||||
snooze(1)
|
||||
type(editor, ">")
|
||||
snooze(1)
|
||||
proposalExists = lambda: object.exists(':popupFrame_TextEditor::GenericProposalWidget')
|
||||
nativeType("%s" % buttonName[0])
|
||||
test.verify(waitFor("object.exists(':popupFrame_TextEditor::GenericProposalWidget')", 1500),
|
||||
"Verify that GenericProposalWidget is being shown.")
|
||||
if test.verify(waitFor(proposalExists, 4000),
|
||||
"Verify that GenericProposalWidget is being shown."):
|
||||
nativeType("<Return>")
|
||||
test.verify(waitFor('str(lineUnderCursor(editor)).strip() == "ui->%s" % buttonName', 1000),
|
||||
'Comparing line "%s" to expected "%s"' % (lineUnderCursor(editor), "ui->%s" % buttonName))
|
||||
lineCorrect = lambda: str(lineUnderCursor(editor)).strip() == "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
|
||||
selectFromLocator("mainwindow.ui")
|
||||
saveAndExit()
|
||||
|
Reference in New Issue
Block a user