23 #define TRACE_UPDATES 0
29 #include <QApplication>
31 #include <QDockWidget>
36 #include <QProgressBar>
38 #include <QFileDialog>
42 #include <QMessageBox>
46 #ifdef QT_DBUS_SUPPORT
47 #include <QtDBus/QDBusConnection>
63 #ifdef QT_DBUS_SUPPORT
66 QDBusConnection::ExportScriptableSlots);
71 _statusLabel =
new QLabel(_statusbar);
91 restoreCurrentState(QString::null);
96 _forcePartDock = topConfig->
value(
"ForcePartDockVisible",
false).
toBool();
116 void QCGTopLevel::resetState()
118 _activeParts.
clear();
119 _hiddenParts.
clear();
129 _traceItemDelayed = 0;
130 _eventTypeDelayed = 0;
131 _eventType2Delayed = 0;
146 void QCGTopLevel::saveCurrentState(
const QString& postfix)
149 if (_eventType) eventType = _eventType->
name();
150 if (_eventType2) eventType2 = _eventType2->
name();
153 stateConfig->
setValue(
"EventType", eventType);
154 stateConfig->
setValue(
"EventType2", eventType2);
167 void QCGTopLevel::saveTraceSettings()
188 saveCurrentState(key);
197 void QCGTopLevel::restoreCurrentState(
const QString& postfix)
212 QMenu *popup = _sidebarMenuAction->
menu();
221 action = popup->
addAction(
tr(
"Top Cost Call Stack"));
235 QMenu *popup = _recentFilesMenuAction->
menu();
240 recentFiles = generalConfig->
value(
"RecentFiles",
242 delete generalConfig;
244 if (recentFiles.
count() == 0)
247 foreach(
const QString& file, recentFiles) {
269 connect(_partSelection, SIGNAL(partsHideSelected()),
271 connect(_partSelection, SIGNAL(partsUnhideAll()),
281 "<b>The Top Cost Call Stack</b>"
282 "<p>This is a purely fictional 'most probable' call stack. "
283 "It is built up by starting with the current selected "
284 "function and adds the callers/callees with highest cost "
285 "at the top and to bottom.</p>"
286 "<p>The <b>Cost</b> and <b>Calls</b> columns show the "
287 "cost used for all calls from the function in the line "
292 connect(_upAction, SIGNAL(triggered(
bool)),
293 _stackSelection, SLOT(browserUp()) );
294 connect(_backAction, SIGNAL(triggered(
bool)),
295 _stackSelection, SLOT(browserBack()) );
296 connect(_forwardAction, SIGNAL(triggered(
bool)),
297 _stackSelection, SLOT(browserForward()));
304 _functionDock->
setWidget(_functionSelection);
306 connect(_functionDock, SIGNAL(visibilityChanged(
bool)),
326 _newAction =
new QAction(
tr(
"&New"),
this);
332 _openAction =
new QAction(icon,
tr(
"&Open..."),
this);
335 connect(_openAction, SIGNAL(triggered()),
this, SLOT(
load()));
337 _addAction =
new QAction(
tr(
"&Add..." ),
this);
338 _addAction->
setStatusTip(
tr(
"Add profile data to current window"));
339 connect(_addAction, SIGNAL(triggered(
bool)), SLOT(
add()));
341 _exportAction =
new QAction(
tr(
"Export Graph"),
this);
342 _exportAction->
setStatusTip(
tr(
"Generate GraphViz file 'callgraph.dot'"));
345 _recentFilesMenuAction =
new QAction(
tr(
"Open &Recent"),
this);
347 connect(_recentFilesMenuAction->
menu(), SIGNAL(aboutToShow()),
352 _exitAction =
new QAction(
tr(
"E&xit"),
this);
353 _exitAction->setShortcut(
tr(
"Ctrl+Q"));
354 _exitAction->setStatusTip(
tr(
"Exit the application"));
355 connect(_exitAction, SIGNAL(triggered()),
this, SLOT(
close()));
359 _cyclesToggleAction =
new QAction(icon,
tr(
"Detect Cycles"),
this);
362 hint =
tr(
"<b>Detect recursive cycles</b>"
363 "<p>If this is switched off, the treemap drawing will show "
364 "black areas when a recursive call is made instead of drawing "
365 "the recursion ad infinitum. Note that "
366 "the size of black areas often will be wrong, as inside "
367 "recursive cycles the cost of calls cannot be determined; "
368 "the error is small, "
369 "however, for false cycles (see documentation).</p>"
370 "<p>The correct handling for cycles is to detect them and "
371 "collapse all functions of a cycle into an artificial "
372 "function, which is done when this option is selected. "
373 "Unfortunately, with GUI applications, this often will "
374 "lead to huge false cycles, making the analysis impossible; "
375 "therefore, there is the option to switch this off.</p>");
377 connect(_cyclesToggleAction, SIGNAL(triggered(
bool)),
381 _percentageToggleAction =
new QAction(
QIcon(
":/percent.png"),
382 tr(
"Relative Cost"),
this);
385 connect(_percentageToggleAction, SIGNAL(triggered(
bool)),
389 _hideTemplatesToggleAction =
new QAction(
QIcon(
":/hidetemplates.png"),
390 tr(
"Shorten Templates"),
this);
392 _hideTemplatesToggleAction->
setStatusTip(
tr(
"Hide Template Parameters "
394 connect(_hideTemplatesToggleAction, SIGNAL(triggered(
bool)),
397 hint =
tr(
"<b>Hide Template Parameters in C++ Symbols</b>"
398 "<p>If this is switched on, every symbol displayed will have "
399 "any C++ template parameters hidden, just showing <> "
400 "instead of a potentially nested template parameter.</p>"
401 "<p>In this mode, you can hover the mouse pointer over the "
402 "activated symbol label to show a tooltip with the "
403 "unabbreviated symbol.</p>");
406 _expandedToggleAction =
new QAction(
QIcon(
":/move.png"),
407 tr(
"Relative to Parent"),
this);
410 tr(
"Show Percentage relative to Parent"));
411 hint =
tr(
"<b>Show percentage costs relative to parent</b>"
412 "<p>If this is switched off, percentage costs are always "
413 "shown relative to the total cost of the profile part(s) "
414 "that are currently browsed. By turning on this option, "
415 "percentage cost of shown cost items will be relative "
416 "to the parent cost item.</p>"
418 "<tr><td><b>Cost Type</b></td><td><b>Parent Cost</b></td></tr>"
419 "<tr><td>Function Inclusive</td><td>Total</td></tr>"
420 "<tr><td>Function Self</td><td>Function Group (*)/Total</td></tr>"
421 "<tr><td>Call</td><td>Function Inclusive</td></tr>"
422 "<tr><td>Source Line</td><td>Function Inclusive</td></tr>"
424 "<p>(*) Only if function grouping is switched on "
425 "(e.g. ELF object grouping).</p>");
427 connect(_expandedToggleAction, SIGNAL(triggered(
bool)),
431 _splittedToggleAction =
new QAction(
tr(
"Splitted Visualization"),
this);
434 tr(
"Show visualization of two cost items"));
435 connect(_splittedToggleAction, SIGNAL(triggered(
bool)),
438 _splitDirectionToggleAction =
new QAction(
tr(
"Split Horizontal"),
this);
441 tr(
"Split visualization area horizontally"));
442 connect(_splitDirectionToggleAction, SIGNAL(triggered(
bool)),
445 _sidebarMenuAction =
new QAction(
tr(
"Sidebars"),
this);
447 connect( _sidebarMenuAction->
menu(), SIGNAL( aboutToShow() ),
450 _layoutDup =
new QAction(
tr(
"&Duplicate"),
this);
452 _layoutDup->setShortcut(Qt::CTRL + Qt::Key_Plus);
453 _layoutDup->setStatusTip(
tr(
"Duplicate current layout"));
455 _layoutRemove =
new QAction(
tr(
"&Remove"),
this);
459 _layoutNext =
new QAction(
tr(
"Go to &Next"),
this);
461 _layoutNext->
setShortcut(Qt::CTRL + Qt::Key_Right);
464 _layoutPrev =
new QAction(
tr(
"Go to &Previous"),
this);
469 _layoutRestore =
new QAction(
tr(
"&Restore to Default"),
this);
473 _layoutSave =
new QAction(
tr(
"&Save as Default"),
this);
479 _upAction =
new QAction(icon,
tr(
"Up" ),
this );
487 hint =
tr(
"Go to last selected caller of current function");
491 _backAction =
new QAction(icon,
tr(
"Back"),
this);
495 connect(_backAction->
menu(), SIGNAL(aboutToShow()),
499 hint =
tr(
"Go back in function selection history");
503 _forwardAction =
new QAction(icon,
tr(
"Forward"),
this);
507 connect(_forwardAction->
menu(), SIGNAL(aboutToShow()),
511 hint =
tr(
"Go forward in function selection history");
515 _configureAction =
new QAction(
tr(
"&Configure..."),
this);
520 _aboutAction =
new QAction(
tr(
"&About QCachegrind..."),
this);
521 _aboutAction->
setStatusTip(
tr(
"Show the application's About box"));
522 connect(_aboutAction, SIGNAL(triggered()),
this, SLOT(
about()));
524 _aboutQtAction =
new QAction(
tr(
"About Qt..."),
this);
525 connect(_aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
530 hint =
tr(
"Select primary event type of costs");
543 fileMenu->
addAction(_recentFilesMenuAction);
561 viewMenu->
addAction(_cyclesToggleAction);
562 viewMenu->
addAction(_percentageToggleAction);
563 viewMenu->
addAction(_expandedToggleAction);
564 viewMenu->
addAction(_hideTemplatesToggleAction);
566 viewMenu->
addAction(_splittedToggleAction);
567 viewMenu->
addAction(_splitDirectionToggleAction);
576 settingsMenu->
addAction(_sidebarMenuAction);
578 settingsMenu->
addAction(_configureAction);
599 tb->
addAction(_hideTemplatesToggleAction);
615 text =
QString(
"<h3>QCachegrind %1</h3>").
arg(version);
616 text +=
tr(
"<p>QCachegrind is a graphical user interface for analysing "
617 "profiling data, which helps in the performance optimization "
618 "phase of developing a computer program. "
619 "QCachegrind is open-source, and it is distributed under the "
620 "terms of the GPL v2. For details and source code, see the "
621 "<a href=\"http://kcachegrind.sf.net\">homepage</a> of the "
622 "KCachegrind project.</p>"
623 "Main author and maintainer: "
624 "<a href=\"mailto:Josef.Weidendorfer@gmx.de\">"
625 "Josef Weidendorfer</a><br>"
626 "(with lots of bug fixes and porting to Qt4 by the KDE team)");
632 static QString lastPage = QString::null;
638 if (d.
exec() == QDialog::Accepted) {
664 _functionDock->
show();
666 _functionDock->
hide();
759 tr(
"Open Callgrind Data"),
761 tr(
"Callgrind Files (callgrind.*);;All Files (*)"));
768 _lastFile = files[0];
781 int filesLoaded = d->
load(files);
785 if (!addToRecentFiles)
return;
790 recentFiles = generalConfig->
value(
"RecentFiles",
796 if (recentFiles.
count() >5)
799 generalConfig->
setValue(
"RecentFiles", recentFiles);
800 delete generalConfig;
808 tr(
"Add Callgrind Data"),
810 tr(
"Callgrind Files (callgrind.*);;All Files (*)"));
818 _lastFile = files[0];
830 int filesLoaded = d->
load(files);
837 _loadFilesDelayed << file;
839 _addToRecentFiles = addToRecentFiles;
845 _loadFilesDelayed << files;
847 _addToRecentFiles = addToRecentFiles;
853 if (_loadFilesDelayed.
isEmpty())
return;
855 load(_loadFilesDelayed, _addToRecentFiles);
856 _loadFilesDelayed.
clear();
862 if (!_data || !_function)
return;
865 GraphExporter ge(_data, _function, _eventType, _groupType, n);
873 qDebug() <<
"QCGTopLevel::exportGraph: can not run " << cmd;
918 if (_eventType == ct)
return false;
938 if (_eventType2 == ct)
return false;
987 if (_groupType == gt)
return false;
1001 if (idx==-1)
return false;
1004 if (saGroup->currentItem() != idx)
1005 saGroup->setCurrentItem(idx);
1010 _partSelection->
set(_groupType);
1011 _functionSelection->
set(_groupType);
1012 _multiView->
set(_groupType);
1031 if (_group == g)
return false;
1042 if (!_data)
return false;
1045 if (!f)
return false;
1052 if (_function == f)
return false;
1068 qDebug(
"QCGTopLevel::setFunction(%s), lastSender %s",
1070 _lastSender ? _lastSender->
name() :
"0" );
1086 _eventTypeDelayed = ct;
1092 _eventType2Delayed = ct;
1108 _groupTypeDelayed = gt;
1120 qDebug(
"QCGTopLevel::setGroupDelayed(%s), sender %s",
1122 _lastSender ? _lastSender->
name() :
"0" );
1136 _directionDelayed = d;
1142 switch(_directionDelayed) {
1173 if (_traceItemDelayed == i)
return;
1174 _traceItemDelayed = i;
1177 qDebug() <<
"Selected " << (i ? i->
fullName() :
"(none)");
1180 qDebug(
"QCGTopLevel::setTraceItemDelayed(%s), sender %s",
1182 _lastSender ? _lastSender->
name() :
"0" );
1190 if (!_traceItemDelayed)
return;
1192 switch(_traceItemDelayed->
type()) {
1201 _multiView->
activate(_traceItemDelayed);
1207 _multiView->
activate(_traceItemDelayed);
1213 _traceItemDelayed = 0;
1225 if (data == _data)
return;
1229 saveTraceSettings();
1234 _functionSelection->
setData(0);
1261 _eventTypes = types;
1264 _stackSelection->
setData(_data);
1265 _partSelection->
setData(_data);
1266 _functionSelection->
setData(_data);
1273 restoreTraceTypes();
1275 restoreTraceSettings();
1281 caption +=
" [" + _data->
command() +
']';
1285 if (!_data || (!_forcePartDock && _data->
parts().
count()<2))
1296 QMenu *popup1, *popup2 = 0;
1299 popup1 = popup->
addMenu(
tr(
"Primary Event Type"));
1304 popup2 = popup->
addMenu(
tr(
"Secondary Event Type"));
1323 if (_eventType == ct) action->
setChecked(
true);
1329 if (_eventType2 == ct) action->
setChecked(
true);
1339 if (_eventType == ct) action->
setChecked(
true);
1345 if (_eventType2 == ct) action->
setChecked(
true);
1360 if (!_data)
return false;
1365 if (
id >=100 &&
id<199) ct = m->
realType(
id-100);
1366 if (
id >=200 &&
id<299) ct = m->
derivedType(
id-200);
1373 if (!_data)
return false;
1378 if (
id >=100 &&
id<199) ct = m->
realType(
id-100);
1379 if (
id >=200 &&
id<299) ct = m->
derivedType(
id-200);
1412 QString QCGTopLevel::traceKey()
1418 for (
int l=0;l<name.
length();l++)
1419 if (name[l].isLetterOrNumber()) key += name[l];
1425 void QCGTopLevel::restoreTraceTypes()
1450 if (!_eventType && !_eventTypes.
isEmpty())
1468 void QCGTopLevel::restoreTraceSettings()
1474 restoreCurrentState(key);
1483 if (!_traceItemDelayed) {
1494 hc.
addCost(&(*it), (*it).inclusive()->subCost(_eventType));
1510 _layoutCurrent = _layoutCount;
1515 qDebug() <<
"QCGTopLevel::layoutDuplicate: count " << _layoutCount;
1520 if (_layoutCount <2)
return;
1522 int from = _layoutCount-1;
1523 if (_layoutCurrent == from) { _layoutCurrent--; from--; }
1532 qDebug() <<
"QCGTopLevel::layoutRemove: count " << _layoutCount;
1537 if (_layoutCount <2)
return;
1542 _multiView->
saveLayout(layoutPrefix.
arg(_layoutCurrent), key);
1544 if (_layoutCurrent == _layoutCount) _layoutCurrent = 0;
1547 qDebug() <<
"QCGTopLevel::layoutNext: current " << _layoutCurrent;
1552 if (_layoutCount <2)
return;
1557 _multiView->
saveLayout(layoutPrefix.
arg(_layoutCurrent), key);
1559 if (_layoutCurrent <0) _layoutCurrent = _layoutCount-1;
1562 qDebug() <<
"QCGTopLevel::layoutPrevious: current " << _layoutCurrent;
1570 _multiView->
saveLayout(layoutPrefix.
arg(_layoutCurrent), key);
1573 for(
int i=0;i<_layoutCount;i++) {
1581 layoutConfig->
setValue(
"DefaultCount", _layoutCount);
1582 layoutConfig->
setValue(
"DefaultCurrent", _layoutCurrent);
1583 delete layoutConfig;
1589 _layoutCount = layoutConfig->
value(
"DefaultCount", 0).
toInt();
1590 _layoutCurrent = layoutConfig->
value(
"DefaultCurrent", 0).
toInt();
1591 delete layoutConfig;
1593 if (_layoutCount == 0) {
1617 _statusbar->
showMessage(
tr(
"Layout Count: %1").arg(_layoutCount),
1625 _statusLabel->
setText(
tr(
"No profile data file loaded."));
1634 status +=
tr(
"Total %1 Cost: %2")
1646 status +=
tr(
"No event type selected");
1657 _statusLabel->
setText(status);
1665 saveTraceSettings();
1666 saveCurrentState(QString::null);
1670 _forcePartDock =
false;
1672 _forcePartDock=
true;
1675 topConfig->
setValue(
"ForcePartDockVisible", _forcePartDock,
false);
1687 if (count<1) count = 1;
1688 if (count>2) count = 2;
1693 _splitDirectionToggleAction->
setEnabled(count>1);
1701 Qt::Horizontal : Qt::Vertical );
1729 _activeParts = list;
1731 _partSelection->
set(list);
1733 _functionSelection->
set(list);
1734 _multiView->
set(list);
1759 _hiddenParts = newHidden;
1763 _mainWidget1->hiddenPartsChangedSlot(_hiddenParts);
1764 _mainWidget2->hiddenPartsChangedSlot(_hiddenParts);
1780 _hiddenParts.
clear();
1784 _mainWidget1->hiddenPartsChangedSlot(_hiddenParts);
1785 _mainWidget2->hiddenPartsChangedSlot(_hiddenParts);
1819 action->setData(count);
1856 action->setData(count);
1888 action->setData(count);
1942 while (count>0 && f) {
1960 static bool msgUpdateNeeded =
true;
1962 if (!_statusbar)
return;
1968 delete _progressBar;
1977 _progressStart.
start();
1979 if (msg != _progressMsg) {
1981 msgUpdateNeeded =
true;
1985 if (_progressStart.
elapsed() < 500)
1988 if (!_progressBar) {
1992 _progressBar->
show();
1993 msgUpdateNeeded =
true;
1998 if (msgUpdateNeeded) {
2000 msgUpdateNeeded =
false;
2005 qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
2030 <<
":" << line <<
": " << msg;
2036 <<
":" << line <<
": " << msg;
2039 #include "qcgtoplevel.moc"
StackBrowser * browser() const
void setEventType2(EventType *)
void addToolBar(Qt::ToolBarArea area, QToolBar *toolbar)
ProfileContext::Type type()
QByteArray toByteArray() const
static void setShowPercentage(bool)
TraceFunction * function()
QString toNativeSeparators(const QString &pathName)
static bool showPercentage()
void toggleHideTemplates()
void saveLayout(const QString &prefix, const QString &postfix)
virtual void loadProgress(int progress)
void recentFilesMenuAboutToShow()
void set(ProfileContext::Type g)
QString fromNativeSeparators(const QString &pathName)
bool setEventType2(EventType *)
void setEventType2(EventType *t)
QMenuBar * menuBar() const
static QString typeName(Type)
void showMessage(const QString &message, int timeout)
void about(QWidget *parent, const QString &title, const QString &text)
ProfileCostArray * search(ProfileContext::Type, QString, EventType *ct=0, ProfileCostArray *parent=0)
Search for item with given name and highest subcost of given cost type.
QAction * createAction(QObject *parent)
ProfileContext::Type type() const
void setMinimumContentsLength(int characters)
void setFunction(TraceFunction *)
QStatusBar * statusBar() const
bool setGroupType(ProfileContext::Type)
void groupTypeSelected(int)
void closeEvent(QCloseEvent *)
QString prettySubCost(EventType *)
Returns a cost attribute converted to a string (with space after every 3 digits)
void setEventType(EventType *t)
bool registerObject(const QString &path, QObject *object, QFlags< QDBusConnection::RegisterOption > options)
void configure(QString page=QString::null)
void partsUnhideAllSlotDelayed()
virtual void setValue(const QString &key, const QVariant &value, const QVariant &defaultValue=QVariant())
Base class for cost items.
void setGroup(TraceCostItem *)
void activePartsChangedSlot(const TracePartList &list)
QDBusConnection sessionBus()
static GlobalConfig * config()
void updateView(bool force=false)
int addKnownDerivedTypes()
Adds all known derived event types that can be parsed.
EventTypeSet * eventTypes()
void eventType2Selected(const QString &)
QString activePartRange()
TraceFunction * caller(TraceFunction *, bool extend)
HistoryItem * goForward()
QString tr(const char *sourceText, const char *disambiguation, int n)
bool activateParts(const TracePartList &)
returns true if something changed.
void setData(TraceData *)
void hiddenPartsChangedSlot(const TracePartList &list)
void setTraceItemDelayed()
EventType * typeForLong(const QString &)
static ConfigGroup * group(const QString &group, const QString &optSuffix=QString())
void partsUnhideAllSlot()
void restoreOptions(const QString &prefix, const QString &postfix)
void forwardAboutToShow()
TracePartList parts() const
int findText(const QString &text, QFlags< Qt::MatchFlag > flags) const
virtual void loadFinished(const QString &msg)
const char * name() const
An array of basic cost metrics for a trace item.
void backTriggered(QAction *)
void setEventTypeDelayed()
int count(const T &value) const
static void setShowCycles(bool)
void restoreOptions(const QString &prefix, const QString &postfix)
bool setGroup(TraceCostItem *)
void append(const T &value)
void setShortcuts(const QList< QKeySequence > &shortcuts)
int toInt(bool *ok) const
void setData(TraceData *)
void updateFunctionCycles()
A class to calculate the ProfileCostArray items with highest cost.
int load(QStringList files)
Loads profile data files.
void setObjectName(const QString &name)
void addEventTypeMenu(QMenu *, bool)
QString fullName() const
Returns type name + dynamic name.
int removeAll(const T &value)
void eventTypeSelected(const QString &)
void setGroupTypeDelayed()
virtual QString name() const
Returns dynamic name info (without type)
QString prettyName() const
Similar to name, but prettyfied = more descriptive to humans.
virtual void loadError(int line, const QString &msg)
void setEventType(EventType *)
void setCentralWidget(QWidget *widget)
void functionVisibilityChanged(bool)
void setText(const QString &)
bool activate(CostItem *i)
void updateLayoutActions()
virtual void loadWarning(int line, const QString &msg)
static QString shortenSymbol(const QString &)
A group of configuration settings.
void notifyChange(int changeType)
bool setFunction(TraceFunction *)
void setWhatsThis(const QString &what)
static GlobalGUIConfig * config()
void setData(const QVariant &userData)
void showStatus(const QString &msg, int progress)
void loadDelayed(QString file, bool addToRecentFiles=true)
void setEventType2Delayed()
QIcon standardIcon(StandardPixmap standardIcon, const QStyleOption *option, const QWidget *widget) const
void saveOptions(const QString &prefix, const QString &postfix)
void setData(TraceData *)
void setShortcut(const QKeySequence &shortcut)
bool contains(const T &value) const
void upTriggered(QAction *)
QByteArray saveState(int version) const
void addCost(ProfileCostArray *, SubCost)
bool setEventType(EventType *)
EventType * realType(int)
A Trace Part: All data read from a trace file, containing all costs that happened in a specified time...
void setStatusTip(const QString &statusTip)
void writeDot(QIODevice *=0)
static void setHideTemplates(bool)
static bool showExpanded()
QStringList toStringList() const
QString shortTraceName() const
void restoreLayout(const QString &prefix, const QString &postfix)
static bool hideTemplates()
bool restoreState(const QByteArray &state, int version)
void setCurrentIndex(int index)
void setDirectionDelayed()
void addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget)
void recentFilesTriggered(QAction *)
const QString & longName()
A class for managing a set of event types.
void toggleFunctionDock()
void prepend(const T &value)
ProfileContext::Type groupType()
void partsHideSelectedSlotDelayed()
void addItems(const QStringList &texts)
virtual void saveOptions()
TraceFunctionMap & functionMap()
void sidebarMenuAboutToShow()
This class holds profiling data of multiple tracefiles generated with cachegrind on one command...
void setGroupType(ProfileContext::Type)
virtual QString prettyName() const
Similar to name, but prettyfied = more descriptive to humans.
void toggleSplitDirection()
EventType * derivedType(int)
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
void setData(TraceData *)
A TraceData object cannot be viewed many times in different toplevel windows.
static void setShowExpanded(bool)
virtual void loadStart(const QString &filename)
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
void saveOptions(const QString &prefix, const QString &postfix)
void forwardTriggered(QAction *)
static int maxSymbolCount()
QString traceName() const
QByteArray encodeName(const QString &fileName)
QByteArray toAscii() const
void partsHideSelectedSlot()
QStringList getOpenFileNames(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFlags< QFileDialog::Option > options)
void setData(TraceData *)
virtual QVariant value(const QString &key, const QVariant &defaultValue) const
void showMessage(const QString &, int msec)
void invalidateDynamicCost()