186 lines
6.0 KiB
C++
186 lines
6.0 KiB
C++
|
|
#include "dashboard.h"
|
|||
|
|
#include "dataPanel.h"
|
|||
|
|
|
|||
|
|
#include <QDialog>
|
|||
|
|
#include <QPushButton>
|
|||
|
|
#include <QMenu>
|
|||
|
|
#include <QVBoxLayout>
|
|||
|
|
#include <QKeyEvent>
|
|||
|
|
|
|||
|
|
#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<strName.size(); n++)
|
|||
|
|
{
|
|||
|
|
QChar c = strName.at(n);
|
|||
|
|
ushort uni = c.unicode();
|
|||
|
|
if(uni >= 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);
|
|||
|
|
}
|