Commit 0a95b281 authored by Eike Ziller's avatar Eike Ziller

Merge remote-tracking branch 'origin/2.8'

parents cca4cbfb 10d7d61e
Qt Creator version 2.8 contains bug fixes and new features.
There is a total of about 1250 changes by 60 individual contributors.
The most important changes are listed in this document. For a complete
list of changes, see the Git log for the Qt Creator sources that
you can check out from the public Git repository. For example:
git clone git://
git log --cherry-pick --pretty=oneline v2.7.1..origin/2.8
* Moved progress information from mode selector to the bottom-right
of the main window
* Added option to hide detailed progress information and show
summary progress bar instead
* Added "-block" command line option that opens files in a running
Qt Creator and blocks the command line until the editors are closed
* Made mode selector hideable (Window > Show Mode Selector)
* Added option to open extra editor windows (Window > Split New Window)
* Fixed that mouse cursor was hidden when pressing modifier key
* Added support for jumping to column with locator and Go to Line menu
* Added that clicking on line and column display opens locator with line and column filter
* Added option to show file encoding next to line and column display
Managing Projects
* Fixed opening projects created with wizard even if version control
creation fails (QTCREATORBUG-8892)
* Fixed detection of PowerPC ABI
* Fixed detection of ARM-based Windows CE ABI
* Fixed compile output parsers cutting off last character (QTCREATORBUG-9032)
* Added support for new warnings and errors in compile output from GCC 4.8
* Fixed setting default device (QTCREATORBUG-7812)
* Added support for configuring Desktop device
(for example free ports for debugging)
QMake Projects
* Added support for OBJECTIVE_HEADERS
CMake Projects
* Fixed sorting of build targets
* Fixed CXXFLAGS detection when Ninja is used (QTCREATORBUG-9047)
Qbs Projects
* Fixed defines that are passed to the C++ code model
* Added install build step
* Fixed several issues with project tree
* Added run configuration for products in the project
* Added building of single files
Autotools Projects
* Added parsing of defines and C++ flags from Makefile
Generic Projects
* Added filtering for files to add instead of only filtering for files to ignore when
importing projects (QTCREATORBUG-8805)
* Added option to load system GDB pretty printers
* Made adding tasks for missing debug info packages optional
* Fixed stepping out of disassembled function
* Added warning when debugging release build
* Fixed and added nice display of several data types
(QPixmap, QChar, 64bit integers in containers, QString in QVariant)
* Fixed that debugger would sometimes stop at disabled breakpoints (QTCREATORBUG-9295)
* Added experimental support
* Fixed that a fixed port was used instead of using port from device settings
* Added support for IPv6
* Fixed that a fixed port was used instead of using port from device settings
* Added support for IPv6
* Fixed attaching profiler to QML applications to use kits
C++ Support
* Added refactoring action that moves function definition from header to
source (QTCREATORBUG-516)
* Added refactoring action that assigns a function return value or new expression
to local variable (QTCREATORBUG-9052)
* Added refactoring action that adds implementations for pure virtual methods
* Fixed parsing of try-catch in constructor initializer (QTCREATORBUG-9064)
* Fixed handling of non-arguments in function parameter scope (QTCREATORBUG-8316)
* Fixed crash when adding include for undefined identifier in file that
has no other include (QTCREATORBUG-8799)
* Fixed that system headers were not reparsed when project configuration
changes (QTCREATORBUG-9056)
* Fixed highlighting for template parameters for function calls
* Improved support for anonymous classes
* Fixed support for typedef of templated typedefs (QTCREATORBUG-8375)
* Fixed code completion with 'using' declaration inside functions (QTCREATORBUG-2668)
* Fixed highlighting of types when there is 'using Namespace::TypeName' (QTCREATORBUG-7903)
Python Support
* Added an editor with highlighter and indenter
* Added file and class wizards
Diff Viewer
* Enabled by default
* Added folding of skipped lines
* Added folding of files
* Added jumping to original file on double-click
* Added file list combo box
Version Control Systems
* Added "Select All" to clean dialog
* Git
* Added new side-by-side diff viewer
* Added support for interactive rebase
* Added support for updating submodules
* Added support for checking out commit
* Added continue and abort for operations in progress
(rebase, cherry-pick etc.)
* Added support for fixing up previous commit
* Moved all change related actions to a single dialog
* Improved stash handling
* Added dialog for pushing to Gerrit
* Added tags to branches dialog
* Added ability to save repository location for Gerrit
* Added graph toggle button for log viewer
* ClearCase
* Removed useless hijack button for dynamic view
* Fixed movement between views with Ctrl+W, Arrow
* Added setting for .vimrc location (QTCREATORBUG-8748)
* Fixed z., zz, zb and z- commands
* Added support for Vim macro recording
Platform Specific
* Made crash handler for debug builds optional
Qt Support
* Fixed that Qt Creator preferred Qt 4 qmake over the system default
* Added warning for too big icons and splash screens
* Added more application permissions to bar descriptor editor
* Added check for device development mode before deploying
* Fixed certificate marshalling with newer BlackBerry NDKs
* Added auto-detection of device PIN for new debug tokens (QTCREATORBUG-9062)
* Enabled QML debugging for pure QNX devices
* Fixed that key generation locked up UI (QTCREATORBUG-9078)
* Added option to sign packages when creating them
* Fixed that Android device would show up even when no Android SDK
was configured
* Added support for mixed C++/QML debugging
* Added support for QML profiling
* Added more sanity checks for package names (QTCREATORBUG-9200)
* Added visual editor for Android manifest files
Credits for these changes go to:
Aaron McCarthy
Adrien Bustany
Alan Alpert
Alessandro Portale
Andreas Holzammer
André Hartmann
André Pönitz
Andrey M. Tokarev
Aurindam Jana
Christian Kandeler
Christian Stenger
Christian Strømme
Daniel Teske
David Schulz
Debao Zhang
Dmitry Savchenko
Eike Ziller
El Mehdi Fekari
Erik Verbruggen
Eskil Abrahamsen Blomfeldt
Fawzi Mohamed
Friedemann Kleint
Lukas Holecek
Hugues Delorme
Jaroslaw Kobus
Jesper K. Pedersen
Jörg Bornemann
J-P Nurmi
Kai Köhne
Knut Petter Svendsen
Laurent Montel
Leena Miettinen
Lorenz Haas
Lukas Holecek
Marc Mutz
Marco Bubke
Martin T. H. Sandsmark
Michal Klocek
Mitch Curtis
Montel Laurent
Morten Johan Sørvig
Nikolai Kosjar
Orgad Shaneh
Oswald Buddenhagen
Pawel Faron
Petar Perisin
Przemyslaw Gorszkowski
Rafael Roquetto
Robert Löhning
Sergey Belyashov
Sergey Shambir
Shane Peelar
Thiago Macieira
Thomas Hartmann
Tim Jenssen
Timo Jyrinki
Tobias Hunger
Tobias Nätterlund
Tor Arne Vestbø
Victor Ostashevsky

29.9 KB | W: | H:


25.8 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
......@@ -92,8 +92,8 @@
\image qtcreator-deploy-android.png "Deploy configurations"
To copy Qt libraries and files to the project directory and to bundle them
as part of the APK, select the \gui {Use Qt libraries from device} option
and the \gui {Use local Qt libraries} check box. This is the default option
as part of the APK, select the \gui {Bundle Qt libraries in APK} option.
This is the default option
when developing with Qt 5.
\section1 Using Ministro to Install Qt Libraries
......@@ -111,7 +111,7 @@
created by \QC.
To use Ministro to install the Qt libraries, select the
\gui {Use Qt libraries from device} option (without any other options).
\gui {Use Ministro service to install Qt} option.
This is the default option when developing with Qt 4.
......@@ -128,11 +128,16 @@
during development.
Select \gui Projects > \gui Run > \gui {Deploy configurations} >
\gui Details, and then select the \gui {Deploy local Qt libraries} option
and the \gui {Use local Qt libraries} check box to deploy Qt libraries to
\gui Details, and then select the
\gui {Deploy local Qt libraries to temporary directory} option to deploy
Qt libraries to
the \c{/data/local/tmp/qt} folder on the device and to run the application
against them.
To deploy new Qt libraries to the device, select
\gui {Clean Temporary Libraries Directory on Device}. The next time you
deploy the application, Qt libraries are copied to the device again.
\section1 Installing Ministro
The easiest way to install Ministro is to do it on the device via Google
......@@ -143,8 +148,7 @@
from the Google Market or from the
\l{}{Ministro} home page.
Then select the \gui {Install Ministro, system-wide Qt shared
libraries installer} option in \gui Projects > \gui Run >
Then select \gui {Install Ministro from APK} in \gui Projects > \gui Run >
\gui {Deploy configurations} > \gui Details.
You can use this option also to install any Android package (.apk).
!isEmpty(QTCREATOR_PRI_INCLUDED):error("qtcreator.pri already included")
isEqual(QT_MAJOR_VERSION, 5) {
......@@ -6,7 +6,7 @@ Project {
property string ide_version_major: '2'
property string ide_version_minor: '7'
property string ide_version_release: '81'
property string ide_version_release: '82'
property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.' + ide_version_release
property string ide_app_path: qbs.targetOS == "mac" ? "" : "bin"
property string ide_app_target: qbs.targetOS == "mac" ? "Qt Creator" : "qtcreator"
This diff is collapsed.
......@@ -83,10 +83,9 @@ void AndroidDeployStep::ctor()
setDefaultDisplayName(tr("Deploy to Android device"));
m_deployAction = NoDeploy;
m_useLocalQtLibs = false;
if (QtSupport::BaseQtVersion *qt = QtSupport::QtKitInformation::qtVersion(target()->kit()))
if (qt->qtVersion() >= QtSupport::QtVersionNumber(5, 0, 0))
m_useLocalQtLibs = true;
m_deployAction = BundleLibraries;
bool AndroidDeployStep::init()
......@@ -118,7 +117,6 @@ bool AndroidDeployStep::init()
m_apkPathDebug = AndroidManager::apkPath(target(), AndroidManager::DebugBuild).toString();
m_apkPathRelease = AndroidManager::apkPath(target(), AndroidManager::ReleaseBuildSigned).toString();
m_buildDirectory = static_cast<Qt4Project *>(target()->project())->rootQt4ProjectNode()->buildDir();
m_runQASIPackagePath = m_QASIPackagePath;
m_runDeployAction = m_deployAction;
ToolChain *tc = ToolChainKitInformation::toolChain(target()->kit());
if (!tc || tc->type() != QLatin1String(Constants::ANDROID_TOOLCHAIN_TYPE)) {
......@@ -148,15 +146,15 @@ AndroidDeployStep::AndroidDeployAction AndroidDeployStep::deployAction()
return m_deployAction;
bool AndroidDeployStep::useLocalQtLibs()
return m_useLocalQtLibs;
bool AndroidDeployStep::fromMap(const QVariantMap &map)
m_useLocalQtLibs = map.value(QLatin1String(USE_LOCAL_QT_KEY), false).toBool();
m_deployAction = AndroidDeployAction(map.value(QLatin1String(DEPLOY_ACTION_KEY), NoDeploy).toInt());
QVariant useLocalQt = map.value(QLatin1String(USE_LOCAL_QT_KEY));
if (useLocalQt.isValid()) { // old settings
if (useLocalQt.toBool() && m_deployAction == NoDeploy)
m_deployAction = BundleLibraries;
if (m_deployAction == InstallQASI)
m_deployAction = NoDeploy;
return ProjectExplorer::BuildStep::fromMap(map);
......@@ -165,7 +163,6 @@ bool AndroidDeployStep::fromMap(const QVariantMap &map)
QVariantMap AndroidDeployStep::toMap() const
QVariantMap map = ProjectExplorer::BuildStep::toMap();
map.insert(QLatin1String(USE_LOCAL_QT_KEY), m_useLocalQtLibs);
map.insert(QLatin1String(DEPLOY_ACTION_KEY), m_deployAction);
return map;
......@@ -184,7 +181,7 @@ void AndroidDeployStep::cleanLibsOnDevice()
QProcess *process = new QProcess(this);
QStringList arguments = AndroidDeviceInfo::adbSelector(deviceSerialNumber);
arguments << QLatin1String("shell") << QLatin1String("rm") << QLatin1String("-r") << QLatin1String("/data/local/tmp/qt");
connect(process, SIGNAL(finished(int)), this, SLOT(cleanLibsFinished()));
connect(process, SIGNAL(finished(int)), this, SLOT(processFinished()));
const QString adb = AndroidConfigurations::instance().adbToolPath().toString();
Core::MessageManager::instance()->printToOutputPane(adb + QLatin1String(" ")
+ arguments.join(QLatin1String(" ")),
......@@ -194,7 +191,7 @@ void AndroidDeployStep::cleanLibsOnDevice()
delete process;
void AndroidDeployStep::cleanLibsFinished()
void AndroidDeployStep::processFinished()
QProcess *process = qobject_cast<QProcess *>(sender());
QTC_ASSERT(process, return);
......@@ -204,22 +201,35 @@ void AndroidDeployStep::cleanLibsFinished()
void AndroidDeployStep::setDeployAction(AndroidDeployStep::AndroidDeployAction deploy)
void AndroidDeployStep::installQASIPackage(const QString &packagePath)
m_deployAction = deploy;
const QString targetArch = AndroidManager::targetArch(target());
const QString targetSDK = AndroidManager::targetSDK(target());
int deviceAPILevel = targetSDK.mid(targetSDK.indexOf(QLatin1Char('-')) + 1).toInt();
QString deviceSerialNumber = AndroidConfigurations::instance().getDeployDeviceSerialNumber(&deviceAPILevel, targetArch);
if (!deviceSerialNumber.length()) {
Core::MessageManager::instance()->printToOutputPane(tr("Could not run adb. No device found."), Core::MessageManager::NoModeSwitch);
QProcess *process = new QProcess(this);
QStringList arguments = AndroidDeviceInfo::adbSelector(deviceSerialNumber);
arguments << QLatin1String("install") << QLatin1String("-r ") << packagePath;
void AndroidDeployStep::setDeployQASIPackagePath(const QString &package)
m_QASIPackagePath = package;
connect(process, SIGNAL(finished(int)), this, SLOT(processFinished()));
const QString adb = AndroidConfigurations::instance().adbToolPath().toString();
Core::MessageManager::instance()->printToOutputPane(adb + QLatin1String(" ")
+ arguments.join(QLatin1String(" ")),
process->start(adb, arguments);
if (!process->waitForFinished(500))
delete process;
void AndroidDeployStep::setUseLocalQtLibs(bool useLocal)
void AndroidDeployStep::setDeployAction(AndroidDeployStep::AndroidDeployAction deploy)
m_useLocalQtLibs = useLocal;
m_deployAction = deploy;
......@@ -453,17 +463,6 @@ bool AndroidDeployStep::deployPackage()
if (m_runDeployAction == InstallQASI) {
if (!runCommand(deployProc, AndroidConfigurations::instance().adbToolPath().toString(),
<< QLatin1String("install") << QLatin1String("-r ") << m_runQASIPackagePath)) {
raiseError(tr("Qt Android smart installer installation failed"));
disconnect(deployProc, 0, this, 0);
return false;
emit resetDelopyAction();
writeOutput(tr("Installing package onto %1.").arg(m_deviceSerialNumber));
......@@ -75,9 +75,10 @@ class AndroidDeployStep : public ProjectExplorer::BuildStep
enum AndroidDeployAction
NoDeploy, // use ministro
InstallQASI, // unused old value
......@@ -89,28 +90,25 @@ public:
int deviceAPILevel();
AndroidDeployAction deployAction();
bool useLocalQtLibs();
bool fromMap(const QVariantMap &map);
QVariantMap toMap() const;
void cleanLibsOnDevice();
void installQASIPackage(const QString &packagePath);
public slots:
void setDeployAction(AndroidDeployAction deploy);
void setDeployQASIPackagePath(const QString &package);
void setUseLocalQtLibs(bool useLocal);
void done();
void error();
void resetDelopyAction();
private slots:
bool deployPackage();
void handleBuildOutput();
void handleBuildError();
void cleanLibsFinished();
void processFinished();
AndroidDeployStep(ProjectExplorer::BuildStepList *bc,
......@@ -140,7 +138,6 @@ private:
QString m_QASIPackagePath;
AndroidDeployAction m_deployAction;
bool m_useLocalQtLibs;
// members to transfer data from init() to run
QString m_packageName;
......@@ -47,21 +47,26 @@ AndroidDeployStepWidget::AndroidDeployStepWidget(AndroidDeployStep *step) :
switch (m_step->deployAction()) {
case AndroidDeployStep::NoDeploy:
case AndroidDeployStep::DeployLocal:
case AndroidDeployStep::BundleLibraries:
connect(m_step, SIGNAL(resetDelopyAction()), SLOT(resetAction()));
connect(ui->devicesQtLibs, SIGNAL(clicked()), SLOT(resetAction()));
connect(ui->deployQtLibs, SIGNAL(clicked()), SLOT(setDeployLocalQtLibs()));
connect(ui->ministroOption, SIGNAL(clicked()), SLOT(setMinistro()));
connect(ui->temporaryQtOption, SIGNAL(clicked()), SLOT(setDeployLocalQtLibs()));
connect(ui->bundleQtOption, SIGNAL(clicked()), SLOT(setBundleQtLibs()));
connect(ui->chooseButton, SIGNAL(clicked()), SLOT(setQASIPackagePath()));
connect(ui->useLocalQtLibs, SIGNAL(stateChanged(int)), SLOT(useLocalQtLibsStateChanged(int)));
connect(ui->cleanLibsPushButton, SIGNAL(clicked()), SLOT(cleanLibsOnDevice()));
......@@ -80,9 +85,8 @@ QString AndroidDeployStepWidget::summaryText() const
return displayName();
void AndroidDeployStepWidget::resetAction()
void AndroidDeployStepWidget::setMinistro()
......@@ -91,19 +95,20 @@ void AndroidDeployStepWidget::setDeployLocalQtLibs()
void AndroidDeployStepWidget::setBundleQtLibs()
void AndroidDeployStepWidget::setQASIPackagePath()
QString packagePath =
QFileDialog::getOpenFileName(this, tr("Qt Android Smart Installer"),
QDir::homePath(), tr("Android package (*.apk)"));
if (packagePath.length())
if (!packagePath.isEmpty())
void AndroidDeployStepWidget::useLocalQtLibsStateChanged(int state)
m_step->setUseLocalQtLibs(state == Qt::Checked);
void AndroidDeployStepWidget::cleanLibsOnDevice()
......@@ -49,10 +49,11 @@ public:
private slots:
void resetAction();
void setMinistro();
void setDeployLocalQtLibs();
void setBundleQtLibs();
void setQASIPackagePath();
void useLocalQtLibsStateChanged(int);
void cleanLibsOnDevice();
......@@ -6,8 +6,8 @@
<property name="sizePolicy">
......@@ -19,138 +19,88 @@
<property name="windowTitle">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QRadioButton" name="devicesQtLibs">
<property name="toolTip">
<string>Use Qt libraries from device</string>
<property name="text">
<string>Use Qt libraries from device</string>
<property name="checked">
<layout class="QHBoxLayout" name="horizontalLayout">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Qt Deployment</string>
<layout class="QVBoxLayout" name="verticalLayout">
<widget class="QRadioButton" name="ministroOption">
<property name="toolTip">
<string>Use the external Ministro application to download and maintain Qt libraries.</string>
<property name="text">
<string>Use Ministro service to install Qt</string>
<property name="checked">
<widget class="QRadioButton" name="temporaryQtOption">
<property name="toolTip">
<string>Push local Qt libraries to device. You must have Qt libraries compiled for that platform.
The APK will not be usable on any other device.</string>
<property name="text">
<string>Deploy local Qt libraries to temporary directory</string>