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"
......@@ -325,7 +325,7 @@ lldb.SBType.unqualified = lambda self: self.GetUnqualifiedType()
lldb.SBType.pointer = lambda self: self.GetPointerType()
lldb.SBType.code = lambda self: self.GetTypeClass()
lldb.SBType.sizeof = property(lambda self: self.GetByteSize())
lldb.SBType.strip_typedefs = lambda self: self
lldb.SBType.strip_typedefs = lambda self: self.GetCanonicalType()
def simpleEncoding(typeobj):
code = typeobj.GetTypeClass()
......@@ -504,6 +504,8 @@ class Dumper:
self.useLldbDumpers = False
self.ns = ""
self.autoDerefPointers = True
self.useDynamicType = True
self.useLoop = True
self.currentIName = None
self.currentValuePriority = -100
......@@ -517,11 +519,13 @@ class Dumper:
self.currentChildType = None
self.currentChildNumChild = None
self.executable_ = None
self.charType_ = None
self.intType_ = None
self.sizetType_ = None
self.charPtrType_ = None
self.voidType_ = None
self.isShuttingDown_ = False
def extractTemplateArgument(self, typename, index):
level = 0
......@@ -564,12 +568,12 @@ class Dumper:
def intType(self):
if self.intType_ is None:
self.intType_ ='int')
self.intType_ ='int')
return self.intType_
def charType(self):
if self.charType_ is None:
self.charType_ ='char')
self.charType_ ='char')
return self.charType_
def charPtrType(self):
......@@ -578,9 +582,11 @@ class Dumper:
return self.charPtrType_
def voidPtrType(self):
return None
return self.charPtrType() # FIXME
def voidPtrSize(self):
return None
return self.charPtrType().GetByteSize()
def sizetType(self):
......@@ -676,43 +682,46 @@ class Dumper:
return xrange(min(self.currentMaxNumChild, self.currentNumChild))
def lookupType(self, name):
#warn("LOOKUP: %s" %
#warn("LOOKUP: %s" %
def setupInferior(self, args):
fileName = args['executable']
executable = args['executable']
self.executable_ = executable
error = lldb.SBError() = self.debugger.CreateTarget(fileName, None, None, True, error) = self.debugger.CreateTarget(executable, None, None, True, error)
self.listener =
self.process =, None, None,
None, None, None,
None, 0, True, error)
self.broadcaster = self.process.GetBroadcaster()
rc = self.broadcaster.AddListener(self.listener, 15)
if rc != 15:
if'state="inferiorsetupok",msg="%s",exe="%s"' % (error, fileName))'state="inferiorsetupok",msg="%s",exe="%s"' % (error, executable))
else:'state="inferiorsetupfailed",msg="%s",exe="%s"' % (error, fileName))
self.importDumpers()'state="inferiorsetupfailed",msg="%s",exe="%s"' % (error, executable))
warn("STATE AFTER LAUNCH: %s" % stateNames[self.process.GetState()])
def runEngine(self, _):
error = lldb.SBError()
#launchInfo = lldb.SBLaunchInfo(["-s"])
#self.process =, None, None,
# None, '/tmp/stdout.txt', None,
# None, 0, True, error)
self.listener = lldb.SBListener("event_Listener")
self.process =, None, None,
None, None, None,
+ lldb.eLaunchFlagDebug
#+ lldb.eLaunchFlagDebug
#+ lldb.eLaunchFlagStopAtEntry
#+ lldb.eLaunchFlagDisableSTDIO
#+ lldb.eLaunchFlagLaunchInSeparateProcessGroup
, False, error)
self.reportError(error) = self.process.GetProcessID()'pid="%s"' %'state="enginerunok"')
error = self.process.Continue()
s = threading.Thread(target=self.loop, args=[])
if self.useLoop:
s = threading.Thread(target=self.loop, args=[])
def describeError(self, error):
desc = lldb.SBStream()
......@@ -809,15 +818,16 @@ class Dumper:
self.currentType = str(type)
self.currentTypePriority = self.currentTypePriority + 1
def readRawMemory(self, base, size):
error = lldb.SBError()
if size == 0:
return ""
#warn("BASE: %s " % base)
#warn("SIZE: %s " % size)
base = int(base) & 0xFFFFFFFFFFFFFFFF
size = int(size) & 0xFFFFFFFF
#warn("BASEX: %s " % base)
#warn("SIZEX: %s " % size)
error = lldb.SBError()
contents = self.process.ReadMemory(base, size, error)
return binascii.hexlify(contents)
......@@ -1010,18 +1020,26 @@ class Dumper:
if state != self.eventState:'state="%s"' % stateNames[state])
self.eventState = state
#if state == lldb.eStateExited:
# warn("PROCESS EXITED. %d: %s"
# % (self.process.GetExitStatus(), self.process.GetExitDescription()))
if state == lldb.eStateExited:
if self.isShuttingDown_:'state="inferiorshutdownok"')
% (self.process.GetExitStatus(), self.process.GetExitDescription()))
if type == lldb.SBProcess.eBroadcastBitStateChanged:
#if state == lldb.eStateStopped:
elif type == lldb.SBProcess.eBroadcastBitInterrupt:
elif type == lldb.SBProcess.eBroadcastBitSTDOUT:
# FIXME: Size?
msg = self.process.GetSTDOUT(1024)'output={channel="stdout",data="%s"}'
% binascii.hexlify(msg))
elif type == lldb.SBProcess.eBroadcastBitSTDERR:
msg = self.process.GetSTDERR(1024)'output={channel="stdout",data="%s"}'
% binascii.hexlify(msg))
elif type == lldb.SBProcess.eBroadcastBitProfileData:
......@@ -1127,7 +1145,8 @@ class Dumper:
def listModules(self, args):
result = 'modules=['
for module in
for i in xrange(
module =
result += '{file="%s"' % module.file.fullpath
result += ',name="%s"' % module.file.basename
result += ',addrsize="%s"' % module.addr_size
......@@ -1146,7 +1165,8 @@ class Dumper:
moduleName = args['module']
#file = lldb.SBFileSpec(moduleName)
#module =
for module in
for i in xrange(
module =
if module.file.fullpath == moduleName:
result = 'symbols={module="%s"' % moduleName
......@@ -1174,8 +1194,13 @@ class Dumper:
def executeStep(self, _ = None):
def shutdownInferior(self, _ = None):
self.isShuttingDown_ = True
def quit(self, _ = None):
def executeStepI(self, _ = None):
......@@ -1202,8 +1227,9 @@ class Dumper:
def selectThread(self, thread):
self.handleCommand("thread select " + thread)
def selectThread(self, args):
def requestModuleSymbols(self, frame):
self.handleCommand("target module list " + frame)
......@@ -1213,12 +1239,8 @@ class Dumper:
command = args['command']
self.debugger.GetCommandInterpreter().HandleCommand(command, result)
success = result.Succeeded()
if success:
output = result.GetOutput()
error = ''
output = ''
error = str(result.GetError())
output = result.GetOutput()
error = str(result.GetError())'success="%d",output="%s",error="%s"' % (success, output, error))
def setOptions(self, args):
......@@ -1226,6 +1248,10 @@ class Dumper:
def updateData(self, args):
self.expandedINames = set(args['expanded'].split(','))
self.autoDerefPointers = int(args['autoderef'])
self.useDynamicType = int(args['dyntype'])
# Keep always True for now.
#self.passExceptions = args['pe']
def disassemble(self, args):
......@@ -1279,19 +1305,42 @@ class Dumper:
def execute(self, args):
getattr(self, args['cmd'])(args)'token="%s"' % args['token'])
if 'continuation' in args:
cont = args['continuation']'continuation="%s"' % cont)
def consumeEvents(self):
event = lldb.SBEvent()
if self.listener and self.listener.PeekAtNextEvent(event):
currentDir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
execfile(os.path.join(currentDir, ""))
def doit():
def doit1():
db = Dumper()
db.useLoop = False'state="enginesetupok"')
while True:
readable, _, _ =[sys.stdin], [], [], 0.1)
if sys.stdin in readable:
line = raw_input()
if line.startswith("db "):
def doit2():
db = Dumper()
db.useLoop = True'state="enginesetupok"')
while True:
......@@ -1304,9 +1353,9 @@ def doit():
def testit():
db = Dumper()
db.useLoop = False
error = lldb.SBError() = db.debugger.CreateTarget(sys.argv[2], None, None, True, error)
......@@ -1344,4 +1393,4 @@ def testit():
if len(sys.argv) > 2:
......@@ -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;