- Timestamp:
- Apr 2, 2020 8:38:43 AM (5 years ago)
- Location:
- trunk/src/VBox/Frontends/VirtualBox/src/monitor
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Frontends/VirtualBox/src/monitor/UIMonitorCommon.cpp
r83496 r83509 181 181 const QRectF &chartRect, const QRectF &innerRect, int iOverlayAlpha) 182 182 { 183 (void)data2; 184 (void)data2Color; 185 (void)iOverlayAlpha; 183 186 /* Draw two arcs. one for the inner the other for the outer circle: */ 184 187 painter.setPen(QPen(QColor(100, 100, 100, iOverlayAlpha), 1)); … … 201 204 painter.drawPath(doughnutSlice(chartRect, innerRect, 90 - fAngle, fAngle2)); 202 205 } 206 207 /* static */ 208 QRectF UIMonitorCommon::getScaledRect(const QRectF &outerFrame, float fScaleX, float fScaleY) 209 { 210 if (!outerFrame.isValid()) 211 return QRectF(); 212 QPointF center = outerFrame.center(); 213 float iWidth = fScaleX * outerFrame.width(); 214 float iHeight = fScaleY * outerFrame.height(); 215 return QRectF(QPointF(center.x() - 0.5 * iWidth, center.y() - 0.5 * iHeight), 216 QSizeF(iWidth, iHeight)); 217 } 218 219 /* static */ 220 void UIMonitorCommon::drawDoughnutChart(QPainter &painter, quint64 iMaximum, quint64 data, 221 const QRectF &chartRect, const QRectF &innerRect, int iOverlayAlpha, const QColor &color) 222 { 223 /* Draw a whole non-filled circle: */ 224 painter.setPen(QPen(QColor(100, 100, 100, iOverlayAlpha), 1)); 225 painter.drawArc(chartRect, 0, 3600 * 16); 226 painter.drawArc(innerRect, 0, 3600 * 16); 227 228 /* Draw a white filled circle and the arc for data: */ 229 QPainterPath background = UIMonitorCommon::wholeArc(chartRect).subtracted(UIMonitorCommon::wholeArc(innerRect)); 230 painter.setPen(Qt::NoPen); 231 painter.setBrush(QColor(255, 255, 255, iOverlayAlpha)); 232 painter.drawPath(background); 233 234 /* Draw the doughnut slice for the data: */ 235 float fAngle = 360.f * data / (float)iMaximum; 236 painter.setBrush(color); 237 painter.drawPath(UIMonitorCommon::doughnutSlice(chartRect, innerRect, 90, fAngle)); 238 } -
trunk/src/VBox/Frontends/VirtualBox/src/monitor/UIMonitorCommon.h
r83496 r83509 57 57 const QRectF &chartRect, const QRectF &innerRect, int iOverlayAlpha); 58 58 59 /* Returns a rectangle which is co-centric with @p outerFrame and scaled by @p fScaleX and fScaleY. */ 60 static QRectF getScaledRect(const QRectF &outerFrame, float fScaleX, float fScaleY); 61 62 static void drawDoughnutChart(QPainter &painter, quint64 iMaximum, quint64 data, 63 const QRectF &chartRect, const QRectF &innerRect, int iOverlayAlpha, const QColor &color); 59 64 60 65 private: -
trunk/src/VBox/Frontends/VirtualBox/src/monitor/performance/UIPerformanceMonitor.cpp
r83496 r83509 106 106 void drawPieChart(QPainter &painter, quint64 iMaximum, int iDataIndex, const QRectF &chartRect, bool fWithBorder = true); 107 107 void drawCombinedPieCharts(QPainter &painter, quint64 iMaximum); 108 void drawDoughnutChart(QPainter &painter, quint64 iMaximum, int iDataIndex,109 const QRectF &chartRect, const QRectF &innerRect);110 108 111 109 /** Drawing an overlay rectangle over the charts to indicate that they are disabled. */ … … 481 479 } 482 480 483 void UIChart::drawDoughnutChart(QPainter &painter, quint64 iMaximum, int iDataIndex,484 const QRectF &chartRect, const QRectF &innerRect)485 {486 const QQueue<quint64> *data = m_pMetric->data(iDataIndex);487 if (!data || data->isEmpty())488 return;489 490 /* Draw a whole non-filled circle: */491 painter.setPen(QPen(QColor(100, 100, 100, m_iOverlayAlpha), 1));492 painter.drawArc(chartRect, 0, 3600 * 16);493 painter.drawArc(innerRect, 0, 3600 * 16);494 495 /* Draw a white filled circle and the arc for data: */496 QPainterPath background = UIMonitorCommon::wholeArc(chartRect).subtracted(UIMonitorCommon::wholeArc(innerRect));497 painter.setPen(Qt::NoPen);498 painter.setBrush(QColor(255, 255, 255, m_iOverlayAlpha));499 painter.drawPath(background);500 501 /* Draw the doughnut slice for the data: */502 float fAngle = 360.f * data->back() / (float)iMaximum;503 painter.setBrush(conicalGradientForDataSeries(chartRect, iDataIndex));504 painter.drawPath(UIMonitorCommon::doughnutSlice(chartRect, innerRect, 90, fAngle));505 }506 507 481 QConicalGradient UIChart::conicalGradientForDataSeries(const QRectF &rectangle, int iDataIndex) 508 482 { … … 530 504 if (fData0 && fData1) 531 505 { 532 QRectF innerRect(QPointF(chartRect.left() + 0.25 * chartRect.width(), chartRect.top() + 0.25 * chartRect.height()),533 QSizeF(0.5 * chartRect.width(), 0.5 * chartRect.height()));534 506 /* Draw a doughnut chart where data series are stacked on to of each other: */ 535 507 if (m_pMetric->data(0) && !m_pMetric->data(0)->isEmpty() && 536 508 m_pMetric->data(1) && !m_pMetric->data(1)->isEmpty()) 537 UIMonitorCommon::drawCombinedDoughnutChart(m_pMetric->data(0)->back(), dataSeriesColor(0, 50), 538 m_pMetric->data(1)->back(), dataSeriesColor(1, 50), 539 painter, iMaximum, chartRect, innerRect, m_iOverlayAlpha); 509 UIMonitorCommon::drawCombinedDoughnutChart(m_pMetric->data(1)->back(), dataSeriesColor(1, 50), 510 m_pMetric->data(0)->back(), dataSeriesColor(0, 50), 511 painter, iMaximum, chartRect, 512 UIMonitorCommon::getScaledRect(chartRect, 0.5f, 0.5f), m_iOverlayAlpha); 540 513 #if 0 541 514 /* Draw a doughnut shaped chart and then pie chart inside it: */ 542 drawDoughnutChart(painter, iMaximum, 0 /* iDataIndex */, chartRect, innerRect); 515 UIMonitorCommon::drawDoughnutChart(painter, iMaximum, m_pMetric->data(0)->back(), 516 chartRect, innerRect, m_iOverlayAlpha, dataSeriesColor(0)); 543 517 drawPieChart(painter, iMaximum, 1 /* iDataIndex */, innerRect, false); 544 518 #endif -
trunk/src/VBox/Frontends/VirtualBox/src/monitor/resource/UIResourceMonitor.cpp
r83496 r83509 21 21 #include <QHeaderView> 22 22 #include <QItemDelegate> 23 #include <QLabel> 23 24 #include <QMenuBar> 25 #include <QPainter> 24 26 #include <QPushButton> 25 27 #include <QTableView> … … 61 63 }; 62 64 65 ///#define DEBUG_BACKGROUND 66 /********************************************************************************************************************************* 67 * Class UIVMResourceMonitorHostStats definition. * 68 *********************************************************************************************************************************/ 69 70 class UIVMResourceMonitorHostStats 71 { 72 73 public: 74 75 UIVMResourceMonitorHostStats(); 76 quint64 m_iCPUUserLoad; 77 quint64 m_iCPUKernelLoad; 78 quint64 m_iCPUFreq; 79 quint64 m_iTotalRAM; 80 quint64 m_iFreeRAM; 81 }; 82 83 84 /********************************************************************************************************************************* 85 * Class UIVMResourceMonitorHostCPUWidget definition. * 86 *********************************************************************************************************************************/ 87 88 class UIVMResourceMonitorHostCPUWidget : public QWidget 89 { 90 91 Q_OBJECT; 92 93 public: 94 95 UIVMResourceMonitorHostCPUWidget(QWidget *pParent = 0); 96 void setCPULoad(quint64 iUserLoad, quint64 iKernelLoad, quint64 iCPUFreq); 97 void setChartColors(const QColor &CPUUserLoadColor, const QColor &CPUKernelLoadColor); 98 99 protected: 100 101 virtual void paintEvent(QPaintEvent *pEvent) /* override */; 102 103 private: 104 105 quint64 m_iCPUUserLoad; 106 quint64 m_iCPUKernelLoad; 107 quint64 m_iCPUFreq; 108 int m_iMinimumHeight; 109 int m_iMargin; 110 QColor m_CPUUserColor; 111 QColor m_CPUKernelColor; 112 }; 113 63 114 64 115 /********************************************************************************************************************************* … … 66 117 *********************************************************************************************************************************/ 67 118 68 class UIVMResourceMonitorHostStatsWidget : public Q Widget119 class UIVMResourceMonitorHostStatsWidget : public QIWithRetranslateUI<QWidget> 69 120 { 70 121 71 122 Q_OBJECT; 72 123 73 74 124 public: 75 125 76 126 UIVMResourceMonitorHostStatsWidget(QWidget *pParent = 0); 77 127 void setHostStats(const UIVMResourceMonitorHostStats &hostStats); 128 129 protected: 130 131 virtual void retranslateUi() /* override */; 132 133 private: 134 135 void prepare(); 136 void updateLabels(); 137 138 UIVMResourceMonitorHostCPUWidget *m_pHostCPUChart; 139 QLabel *m_pCPUTitleLabel; 140 QLabel *m_pCPUUserLabel; 141 QLabel *m_pCPUKernelLabel; 142 QLabel *m_pCPUTotalLabel; 143 QColor m_CPUUserColor; 144 QColor m_CPUKernelColor; 145 UIVMResourceMonitorHostStats m_hostStats; 78 146 }; 79 147 … … 150 218 151 219 /********************************************************************************************************************************* 152 * Class UIVMResourceMonitorHostStats definition. *153 *********************************************************************************************************************************/154 155 class UIVMResourceMonitorHostStats156 {157 158 public:159 160 UIVMResourceMonitorHostStats();161 quint64 m_fCPUUserLoad;162 quint64 m_fCPUKernelLoad;163 quint64 m_iTotalRAM;164 quint64 m_iFreeRAM;165 };166 167 /*********************************************************************************************************************************168 220 * Class UIVMResourceMonitorCheckBox definition. * 169 221 *********************************************************************************************************************************/ … … 221 273 222 274 void sigDataUpdate(); 275 void sigHostStatsUpdate(const UIVMResourceMonitorHostStats &stats); 223 276 224 277 public: … … 283 336 284 337 /********************************************************************************************************************************* 338 * Class UIVMResourceMonitorHostCPUWidget implementation. * 339 *********************************************************************************************************************************/ 340 341 UIVMResourceMonitorHostCPUWidget::UIVMResourceMonitorHostCPUWidget(QWidget *pParent /* = 0 */) 342 :QWidget(pParent) 343 , m_iCPUUserLoad(0) 344 , m_iCPUKernelLoad(0) 345 , m_iCPUFreq(0) 346 { 347 m_iMargin = 3; 348 m_iMinimumHeight = 3 * QApplication::style()->pixelMetric(QStyle::PM_LargeIconSize); 349 setMinimumSize(m_iMinimumHeight, m_iMinimumHeight); 350 } 351 352 void UIVMResourceMonitorHostCPUWidget::setCPULoad(quint64 iUserLoad, quint64 iKernelLoad, quint64 iFreq) 353 { 354 m_iCPUUserLoad = iUserLoad; 355 m_iCPUKernelLoad = iKernelLoad; 356 m_iCPUFreq = iFreq; 357 update(); 358 } 359 360 void UIVMResourceMonitorHostCPUWidget::setChartColors(const QColor &CPUUserLoadColor, const QColor &CPUKernelLoadColor) 361 { 362 m_CPUUserColor = CPUUserLoadColor; 363 m_CPUKernelColor = CPUKernelLoadColor; 364 } 365 366 void UIVMResourceMonitorHostCPUWidget::paintEvent(QPaintEvent *pEvent) 367 { 368 QWidget::paintEvent(pEvent); 369 370 QPainter painter(this); 371 painter.setRenderHint(QPainter::Antialiasing); 372 373 int iFrameHeight = m_iMinimumHeight - 2 * m_iMargin; 374 QRectF outerRect = QRectF(QPoint(m_iMargin,m_iMargin), QSize(iFrameHeight, iFrameHeight)); 375 QRectF innerRect = UIMonitorCommon::getScaledRect(outerRect, 0.6f, 0.6f); 376 UIMonitorCommon::drawCombinedDoughnutChart(m_iCPUKernelLoad, m_CPUKernelColor, 377 m_iCPUUserLoad, m_CPUUserColor, 378 painter, 100, 379 outerRect, innerRect, 80); 380 float mul = 1.f / 1.4f; 381 QRectF textRect = UIMonitorCommon::getScaledRect(innerRect, mul, mul); 382 painter.setPen(Qt::black); 383 painter.drawText(textRect, Qt::AlignCenter, QString("%1\nMHz").arg(QString::number(m_iCPUFreq))); 384 } 385 386 387 /********************************************************************************************************************************* 285 388 * Class UIVMResourceMonitorHostStatsWidget implementation. * 286 389 *********************************************************************************************************************************/ 287 390 288 391 UIVMResourceMonitorHostStatsWidget::UIVMResourceMonitorHostStatsWidget(QWidget *pParent /* = 0 */) 289 :QWidget(pParent) 290 { 291 } 392 : QIWithRetranslateUI<QWidget>(pParent) 393 , m_pHostCPUChart(0) 394 , m_pCPUTitleLabel(0) 395 , m_pCPUUserLabel(0) 396 , m_pCPUKernelLabel(0) 397 , m_pCPUTotalLabel(0) 398 , m_CPUUserColor(Qt::red) 399 , m_CPUKernelColor(Qt::blue) 400 { 401 prepare(); 402 retranslateUi(); 403 #ifdef DEBUG_BACKGROUND 404 QPalette pal = palette(); 405 pal.setColor(QPalette::Background, Qt::red); 406 setAutoFillBackground(true); 407 setPalette(pal); 408 #endif 409 } 410 411 void UIVMResourceMonitorHostStatsWidget::setHostStats(const UIVMResourceMonitorHostStats &hostStats) 412 { 413 m_hostStats = hostStats; 414 if (m_pHostCPUChart) 415 m_pHostCPUChart->setCPULoad(m_hostStats.m_iCPUUserLoad, m_hostStats.m_iCPUKernelLoad, m_hostStats.m_iCPUFreq); 416 updateLabels(); 417 } 418 419 void UIVMResourceMonitorHostStatsWidget::retranslateUi() 420 { 421 updateLabels(); 422 } 423 424 void UIVMResourceMonitorHostStatsWidget::prepare() 425 { 426 QHBoxLayout *pLayout = new QHBoxLayout; 427 setLayout(pLayout); 428 429 /* Host CPU Labels: */ 430 QWidget *pCPULabelContainer = new QWidget; 431 pCPULabelContainer->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); 432 433 #ifdef DEBUG_BACKGROUND 434 QPalette pal = pCPULabelContainer->palette(); 435 pal.setColor(QPalette::Background, Qt::yellow); 436 pCPULabelContainer->setAutoFillBackground(true); 437 pCPULabelContainer->setPalette(pal); 438 #endif 439 pLayout->addWidget(pCPULabelContainer); 440 QVBoxLayout *pCPULabelsLayout = new QVBoxLayout; 441 pCPULabelsLayout->setContentsMargins(0, 0, 0, 0); 442 pCPULabelContainer->setLayout(pCPULabelsLayout); 443 m_pCPUTitleLabel = new QLabel; 444 pCPULabelsLayout->addWidget(m_pCPUTitleLabel); 445 m_pCPUUserLabel = new QLabel; 446 pCPULabelsLayout->addWidget(m_pCPUUserLabel); 447 m_pCPUKernelLabel = new QLabel; 448 pCPULabelsLayout->addWidget(m_pCPUKernelLabel); 449 m_pCPUTotalLabel = new QLabel; 450 pCPULabelsLayout->addWidget(m_pCPUTotalLabel); 451 pCPULabelsLayout->setAlignment(Qt::AlignTop); 452 //pLayout->setAlignment(Qt::AlignTop); 453 pCPULabelsLayout->setSpacing(0); 454 /* Host CPU chart widget: */ 455 m_pHostCPUChart = new UIVMResourceMonitorHostCPUWidget; 456 if (m_pHostCPUChart) 457 { 458 pLayout->addWidget(m_pHostCPUChart); 459 m_pHostCPUChart->setChartColors(m_CPUUserColor, m_CPUKernelColor); 460 } 461 pLayout->addStretch(2); 462 } 463 464 void UIVMResourceMonitorHostStatsWidget::updateLabels() 465 { 466 if (m_pCPUTitleLabel) 467 m_pCPUTitleLabel->setText(QString("<b>%1</b>").arg(tr("Host CPU Load"))); 468 if (m_pCPUUserLabel) 469 { 470 QString strColor = QColor(m_CPUUserColor).name(QColor::HexRgb); 471 m_pCPUUserLabel->setText(QString("<font color=\"%1\">%2:%3%</font>").arg(strColor).arg(tr("User")).arg(QString::number(m_hostStats.m_iCPUUserLoad))); 472 } 473 if (m_pCPUKernelLabel) 474 { 475 QString strColor = QColor(m_CPUKernelColor).name(QColor::HexRgb); 476 m_pCPUKernelLabel->setText(QString("<font color=\"%1\">%2:%3%</font>").arg(strColor).arg(tr("Kernel")).arg(QString::number(m_hostStats.m_iCPUKernelLoad))); 477 } 478 if (m_pCPUTotalLabel) 479 m_pCPUTotalLabel->setText(QString("%1:%2%").arg(tr("Total")).arg(m_hostStats.m_iCPUUserLoad + m_hostStats.m_iCPUKernelLoad)); 480 } 481 292 482 293 483 … … 445 635 446 636 UIVMResourceMonitorHostStats::UIVMResourceMonitorHostStats() 447 : m_fCPUUserLoad(0) 448 , m_fCPUKernelLoad(0) 637 : m_iCPUUserLoad(0) 638 , m_iCPUKernelLoad(0) 639 , m_iCPUFreq(0) 449 640 , m_iTotalRAM(0) 450 641 , m_iFreeRAM(0) … … 698 889 m_itemList[i].m_uCPUVMMLoad = aPctVMM; 699 890 } 700 701 891 /* Network rate: */ 702 892 if (fNetworkColumns) … … 709 899 m_itemList[i].m_uNetworkUpRate = m_itemList[i].m_uNetworkUpTotal - uPrevUpTotal; 710 900 } 711 712 901 /* IO rate: */ 713 902 if (fIOColumns) … … 720 909 m_itemList[i].m_uDiskReadRate = m_itemList[i].m_uDiskReadTotal - uPrevReadTotal; 721 910 } 722 723 911 /* VM Exits: */ 724 912 if (fVMExitColumn) … … 731 919 } 732 920 emit sigDataUpdate(); 921 emit sigHostStatsUpdate(m_hostStats); 733 922 } 734 923 … … 745 934 m_nameList << "Guest/RAM/Usage*"; 746 935 /* This is for the host: */ 747 m_nameList << "CPU /Load/User:avg";748 m_nameList << "CPU/Load/Kernel:avg";936 m_nameList << "CPU*"; 937 //m_nameList << "CPU/Load/Kernel*"; 749 938 m_objectList = QVector<CUnknown>(m_nameList.size(), CUnknown()); 750 939 m_performanceMonitor.SetupMetrics(m_nameList, m_objectList, iPeriod, iMetricSetupCount); … … 795 984 } 796 985 } 797 else if (aReturnNames[i].contains("CPU/Load/User", Qt::CaseInsensitive) )986 else if (aReturnNames[i].contains("CPU/Load/User", Qt::CaseInsensitive) && !aReturnNames[i].contains(":")) 798 987 { 799 988 CHost comHost = (CHost)aReturnObjects[i]; 800 989 if (!comHost.isNull()) 801 m_hostStats.m_ fCPUUserLoad = fData;990 m_hostStats.m_iCPUUserLoad = fData; 802 991 } 803 else if (aReturnNames[i].contains("CPU/Load/Kernel", Qt::CaseInsensitive) )992 else if (aReturnNames[i].contains("CPU/Load/Kernel", Qt::CaseInsensitive) && !aReturnNames[i].contains(":")) 804 993 { 805 994 CHost comHost = (CHost)aReturnObjects[i]; 806 995 if (!comHost.isNull()) 807 m_hostStats.m_ fCPUKernelLoad = fData;996 m_hostStats.m_iCPUKernelLoad = fData; 808 997 } 998 else if (aReturnNames[i].contains("CPU/MHz", Qt::CaseInsensitive) && !aReturnNames[i].contains(":")) 999 { 1000 CHost comHost = (CHost)aReturnObjects[i]; 1001 if (!comHost.isNull()) 1002 m_hostStats.m_iCPUFreq = fData; 1003 } 1004 809 1005 } 810 1006 for (int i = 0; i < m_itemList.size(); ++i) … … 857 1053 , m_pProxyModel(0) 858 1054 , m_pModel(0) 1055 , m_pHostStatsWidget(0) 859 1056 , m_pColumnSelectionMenu(0) 860 1057 , m_fIsCurrentTool(true) … … 961 1158 if (m_fShowToolbar) 962 1159 prepareToolBar(); 1160 1161 m_pHostStatsWidget = new UIVMResourceMonitorHostStatsWidget; 1162 if (m_pHostStatsWidget) 1163 layout()->addWidget(m_pHostStatsWidget); 963 1164 964 1165 m_pModel = new UIResourceMonitorModel(this); … … 989 1190 m_pTableView->sortByColumn(0, Qt::AscendingOrder); 990 1191 connect(m_pModel, &UIResourceMonitorModel::sigDataUpdate, this, &UIResourceMonitorWidget::sltHandleDataUpdate); 991 1192 connect(m_pModel, &UIResourceMonitorModel::sigHostStatsUpdate, this, &UIResourceMonitorWidget::sltHandleHostStatsUpdate); 992 1193 updateModelColumVisibilityCache(); 993 1194 } … … 1102 1303 } 1103 1304 1305 void UIResourceMonitorWidget::sltHandleHostStatsUpdate(const UIVMResourceMonitorHostStats &stats) 1306 { 1307 if (m_pHostStatsWidget) 1308 m_pHostStatsWidget->setHostStats(stats); 1309 } 1310 1104 1311 void UIResourceMonitorWidget::sltHandleDataUpdate() 1105 1312 { -
trunk/src/VBox/Frontends/VirtualBox/src/monitor/resource/UIResourceMonitor.h
r83494 r83509 32 32 class QAbstractButton; 33 33 class QFrame; 34 class QLabel; 34 35 class QTableView; 35 36 class QTreeWidgetItem; … … 39 40 class UIResourceMonitorProxyModel; 40 41 class UIResourceMonitorModel; 42 class UIVMResourceMonitorHostStats; 43 class UIVMResourceMonitorHostStatsWidget; 41 44 class UIVMResourceMonitorTableView; 42 45 … … 78 81 void sltToggleColumnSelectionMenu(bool fChecked); 79 82 void sltHandleColumnAction(bool fChecked); 83 void sltHandleHostStatsUpdate(const UIVMResourceMonitorHostStats &stats); 80 84 81 85 private: … … 89 93 void prepare(); 90 94 void prepareWidgets(); 95 void prepareHostStatsWidgets(); 91 96 void prepareToolBar(); 92 97 void prepareActions(); … … 106 111 * @{ */ 107 112 UIToolBar *m_pToolBar; 108 UIVMResourceMonitorTableView *m_pTableView;109 UIResourceMonitorProxyModel *m_pProxyModel;110 UIResourceMonitorModel *m_pModel;111 QVector<QString> m_columnCaptions;113 UIVMResourceMonitorTableView *m_pTableView; 114 UIResourceMonitorProxyModel *m_pProxyModel; 115 UIResourceMonitorModel *m_pModel; 116 QVector<QString> m_columnCaptions; 112 117 /* The key is the column id (VMResourceMonitorColumn) and value is true if the column is visible. */ 113 QMap<int, bool> m_columnVisible; 118 QMap<int, bool> m_columnVisible; 119 UIVMResourceMonitorHostStatsWidget *m_pHostStatsWidget; 120 121 114 122 /** @} */ 115 123 QFrame *m_pColumnSelectionMenu;
Note:
See TracChangeset
for help on using the changeset viewer.