PowerMaster/source/customTab.cpp

181 lines
5.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "customTab.h"
#include "customTabBar.h"
#include "dashboard.h"
#include "dashboardFrame.h"
#include <QLabel>
#include <QBoxLayout>
#include <QMouseEvent>
#include <QDrag>
#include <QMimeData>
#include <QApplication>
CustomTab::CustomTab(QWidget* parent)
:QFrame(parent)
{
setContextMenuPolicy(Qt::CustomContextMenu);
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
setStyleSheet("QLabel{\n"
" color:rgb(250,250,250);\n"
" font:600 11pt \"微软雅黑\";\n"
" border:0px;\n"
" background-color:transparent;\n"
"}\n");
m_pDashboard = nullptr;
m_bLeftButtonPressed = false;
m_bDragging = false;
m_pTitle = new QLabel(this);
m_pTitle->setAlignment(Qt::AlignCenter);
m_IconSize = QSize(15,15);
m_pIconLabel = new QLabel(this);
m_pIconLabel->setMinimumSize(m_IconSize);
m_pIconLabel->setMaximumSize(m_IconSize);
QBoxLayout* iconLayout = new QBoxLayout(QBoxLayout::TopToBottom);
iconLayout->setContentsMargins(0, 1, 0, 0);
iconLayout->addWidget(m_pIconLabel);
QSpacerItem* spacer = new QSpacerItem(10, 40, QSizePolicy::Policy::Minimum, QSizePolicy::Policy::Expanding);
iconLayout->addSpacerItem(spacer);
m_pLayout = new QBoxLayout(QBoxLayout::LeftToRight);
m_pLayout->setContentsMargins(15, 0, 0, 0);
m_pLayout->setSpacing(1);
m_pLayout->addWidget(m_pTitle);
m_pLayout->addLayout(iconLayout);
setLayout(m_pLayout);
}
CustomTab::~CustomTab()
{
}
void CustomTab::mousePressEvent(QMouseEvent* event)
{
if(event->button() == Qt::LeftButton)
{
emit clicked();
m_pStartPos = event->pos();
m_bLeftButtonPressed = true;
}
QFrame::mousePressEvent(event);
}
void CustomTab::mouseMoveEvent(QMouseEvent* event)
{
if(m_bLeftButtonPressed && !m_bDragging)
{
//qDebug() << "dragging";
int distance = (event->pos() - m_pStartPos).manhattanLength();
if (distance >= QApplication::startDragDistance())
{
QPoint hotSpot = event->pos();
QByteArray data;
QDataStream dataStream(&data, QIODevice::WriteOnly);
dataStream << text() << m_pDashboard->frame()->objectName();
QMimeData *mimeData = new QMimeData;
mimeData->setData("dragData/customTab", data);
QDrag* drag = new QDrag(this);
drag->setMimeData(mimeData);
drag->setPixmap(grab()); //通过render绘制的pixmap会有噪点直接通过grab获取效果更好
drag->setHotSpot(hotSpot);
m_bDragging = true;
Qt::DropAction dropAction = drag->exec();
//qDebug() << dropAction;
//exec之后的语句都会在drg操作完成之后(鼠标抬起)执行
delete drag;
m_bLeftButtonPressed = false;
m_bDragging = false;
if(dropAction == Qt::IgnoreAction) //创建新的dvieSecondaryWindow
{
//qDebug() << "create dvieSecondaryWindow on" << QCursor::pos();
m_pDashboard->frame()->moveDashboardToNewDVIEWindow(text(), QCursor::pos());
}
}
}
QFrame::mouseMoveEvent(event);
}
void CustomTab::mouseReleaseEvent(QMouseEvent* event)
{
//如果没有拖动事件发生,在这里处理相关逻辑
m_bLeftButtonPressed = false;
QFrame::mouseReleaseEvent(event);
}
void CustomTab::setActive(bool bActive)
{
QString strStyleSheet = "";
if(bActive)
strStyleSheet = "QFrame{\n"
" border-bottom:3px solid rgb(67,160,249);\n"
"}\n"
"QFrame:hover{\n"
" background-color:rgba(60, 60, 60, 150);\n"
"}\n"
"QLabel{\n"
" color:rgb(250,250,250);\n"
" font:600 11pt \"微软雅黑\";\n"
" border:0px;\n"
"}\n"
"QLabel:hover{\n"
" background-color:transparent;"
"}\n";
else
strStyleSheet = "QFrame{\n"
" border-bottom:0px;\n"
"}\n"
"QFrame:hover{\n"
" background-color:rgba(60, 60, 60, 150);\n"
"}\n"
"QLabel{\n"
" color:rgb(250,250,250);\n"
" font:600 11pt \"微软雅黑\";\n"
" border:0px;\n"
"}\n"
"QLabel:hover{\n"
" background-color:transparent;\n"
"}\n";
setStyleSheet(strStyleSheet);
}
void CustomTab::setText(const QString& strTitle)
{
m_pTitle->setText(strTitle);
QFontMetrics metrics(m_pTitle->font());
QRect rect = metrics.boundingRect(m_pTitle->text());
m_pTitle->setMinimumSize(rect.width() + 12, 0);
m_pTitle->setMaximumSize(rect.width() + 12, 1660);
setObjectName("dashboardTab_" + strTitle);
}
QString CustomTab::text()
{
return m_pTitle->text();
}
void CustomTab::setIcon(const QIcon& icon)
{
if(icon.isNull())
m_pIconLabel->clear();
else
m_pIconLabel->setPixmap(icon.pixmap(m_IconSize));
}
void CustomTab::setDashboard(Dashboard* dashboard)
{
m_pDashboard = dashboard;
}
Dashboard* CustomTab::dashboard()
{
return m_pDashboard;
}