#include "dashboard.h" #include "dataPanel.h" #include #include #include #include #include #define tabButtonHeight 41 Dashboard::Dashboard(const QString& strName, QObject *parent) : QObject(parent) { //displayArea m_pDisplayArea = new QWidget(); m_pDisplayArea->setObjectName("displayArea"); //m_pDisplayArea->setStyleSheet("QWidget #displayArea {background-color: rgb(18, 25, 30);}"); //tabButton,自适应text内容 m_pTabButton = new QPushButton(); m_pTabButton->setContextMenuPolicy(Qt::CustomContextMenu); m_pTabButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); m_pTabButton->setStyleSheet("QPushButton{\n" " font:600 11pt \"微软雅黑\";\n" " padding-left:5px;\n" " padding-right:5px;\n" "}\n"); connect(m_pTabButton, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(contextMenu_tabButton(const QPoint&))); //右键菜单 m_pTabBtnMenu = new QMenu(); m_pTabBtnMenu->setStyleSheet("QMenu{\n" " background-color:rgb(36,43,50);\n" " border:1px solid rgb(6, 6, 6);\n" "}\n" "QMenu:item{\n" " padding-left:20px;\n" " padding-right:20px;\n" " font:9pt \"微软雅黑\";\n" " color:rgb(220,220,220);\n" " height:26px;\n" "}\n" "QMenu:item:selected{\n" " background-color: rgba(67,160,249, 80);\n" "}\n"); m_pTabBtnMenu->addAction(QString::fromWCharArray(L"删除"), this, SLOT(onAction_remove())); m_pTabBtnMenu->addAction(QString::fromWCharArray(L"重命名"), this, SLOT(onAction_rename())); m_nPanenlNameNumber = 0; setName(strName); } Dashboard::~Dashboard() { //m_pMdiArea和m_pTabButton不需要进行以下手动析构,因为QObject建立起的父子结构会自动析构,自动析构时不会将其置为nullptr,所以if判断无效,会引起'SIGSEGV'(存储器段错误)报错 if(m_pTabBtnMenu) { delete m_pTabBtnMenu; m_pTabBtnMenu = nullptr; } } void Dashboard::updateTabButtonSize() { QFontMetrics metrics(m_pTabButton->font()); QRect rect = metrics.boundingRect(m_pTabButton->text()); m_pTabButton->setMinimumSize(rect.width() + 30, tabButtonHeight); m_pTabButton->setMaximumSize(rect.width() + 30, tabButtonHeight); /*int nWidth = 0; for(int n=0; n= 0x4E00 && uni <= 0x9FA5) //为汉字 nWidth += 12; else nWidth += 7; } nWidth += 35; m_pTabButton->setMinimumSize(nWidth, tabButtonHeight); m_pTabButton->setMaximumSize(nWidth, tabButtonHeight);*/ } const QString& Dashboard::getName() { return m_strName; } void Dashboard::setName(const QString& strName) { m_strName = strName; m_pTabButton->setText(strName); updateTabButtonSize(); } QPushButton* Dashboard::tabButton() { return m_pTabButton; } QWidget* Dashboard::displayArea() { return m_pDisplayArea; } void Dashboard::setSelected(bool bSelected) { QString strStyleSheet = ""; if(bSelected) strStyleSheet = "QPushButton{\n" " color:rgb(250,250,250);\n" " font:600 11pt \"微软雅黑\";\n" " border-bottom:3px solid rgb(67,160,249);\n" "}\n" "QPushButton:hover{\n" " background-color: rgba(60, 60, 60, 150);\n" "}\n"; else strStyleSheet = "QPushButton{\n" " color:rgb(220,220,220);\n" " font:11pt \"微软雅黑\";\n" " border-bottom:0px;\n" "}\n" "QPushButton:hover{\n" " background-color: rgba(60, 60, 60, 150);\n" "}\n"; m_pTabButton->setStyleSheet(strStyleSheet); updateTabButtonSize(); } void Dashboard::addPanel(const QString& strType) { DataPanel* panel = new DataPanel(m_pDisplayArea); connect(panel, SIGNAL(sgl_remove(const QString&)), this, SLOT(onSignal_removePanel(const QString&))); QString strDefaultName = "dataPanel-" + QString::number(m_nPanenlNameNumber); m_nPanenlNameNumber++; panel->setName(strDefaultName); //panel->setStyleSheet("QDialog{background-color:transparent;}"); int nCount = m_dataPanels.count(); //QPoint originPoint = m_pDisplayArea->mapToGlobal(QPoint(0, 0)); int nX = /*originPoint.x() +*/ (m_pDisplayArea->width() - panel->width()) * 0.5 + nCount * 10; int nY = /*originPoint.y() +*/ (m_pDisplayArea->height() - panel->height()) * 0.5 + nCount * 10; panel->move(nX, nY); panel->show(); m_dataPanels.push_back(panel); } void Dashboard::removePanel(const QString& strName) { int nIndex = -1; for(int n = 0; n < m_dataPanels.count(); n++) { if(m_dataPanels.at(n)->getName() == strName) { nIndex = n; break; } } if(nIndex != -1) { DataPanel* panel = m_dataPanels.takeAt(nIndex); delete panel; } } void Dashboard::contextMenu_tabButton(const QPoint& pos) { QPoint originPoint = m_pTabButton->mapToGlobal(QPoint(0, 0)); m_pTabBtnMenu->popup(originPoint + pos); } void Dashboard::onAction_remove() { emit sgl_remove(); } void Dashboard::onAction_rename() { emit sgl_rename(); } void Dashboard::onSignal_removePanel(const QString& strName) { removePanel(strName); }