#include "ElaTabWidgetPrivate.h" #include "ElaCustomTabWidget.h" #include "ElaTabBar.h" #include "ElaTabWidget.h" #include #include #include #include ElaTabWidgetPrivate::ElaTabWidgetPrivate(QObject* parent) : QObject{parent} { } ElaTabWidgetPrivate::~ElaTabWidgetPrivate() { } void ElaTabWidgetPrivate::onTabDragCreate(QDrag* drag) { Q_Q(ElaTabWidget); QMimeData* mimeData = drag->mimeData(); mimeData->setProperty("ElaTabWidgetObject", QVariant::fromValue(q)); int index = mimeData->property("TabIndex").toInt(); QString tabText = q->tabText(index); QIcon tabIcon = q->tabIcon(index); QWidget* dragWidget = q->widget(index); QVariant originTabWidgetVariant = dragWidget->property("ElaOriginTabWidget"); ElaTabBar* tabBarObject = mimeData->property("ElaTabBarObject").value(); if (!originTabWidgetVariant.isValid() && q->objectName() != "ElaCustomTabWidget") { dragWidget->setProperty("ElaOriginTabWidget", QVariant::fromValue(q)); } mimeData->setProperty("DragWidget", QVariant::fromValue(dragWidget)); QMouseEvent releaseEvent(QEvent::MouseButtonRelease, QPoint(-1, -1), QPoint(-1, -1), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); QApplication::sendEvent(tabBarObject, &releaseEvent); if (drag->exec() == Qt::IgnoreAction) { // 创建新窗口 ElaTabBar* originCustomTabBar = tabBarObject; if (originCustomTabBar && originCustomTabBar->objectName() == "ElaCustomTabBar") { originCustomTabBar->removeTab(index); } QWidget* floatParentWidget = originTabWidgetVariant.value(); if (!floatParentWidget) { floatParentWidget = dragWidget->property("ElaFloatParentWidget").value(); } ElaCustomTabWidget* floatWidget = new ElaCustomTabWidget(floatParentWidget); ElaTabBar* customTabBar = floatWidget->getCustomTabBar(); dragWidget->setProperty("CurrentCustomBar", QVariant::fromValue(customTabBar)); floatWidget->addTab(dragWidget, tabIcon, tabText); floatWidget->show(); QPoint cursorPoint = QCursor::pos(); floatWidget->move(cursorPoint.x() - floatWidget->width() / 2, cursorPoint.y() - 40); } } void ElaTabWidgetPrivate::onTabDragDrop(const QMimeData* mimeData) { Q_Q(ElaTabWidget); QWidget* dragWidget = mimeData->property("DragWidget").value(); QString tabText = mimeData->property("TabText").toString(); QIcon tabIcon = mimeData->property("TabIcon").value(); ElaTabBar* customTabBar = mimeData->property("ElaTabBarObject").value(); int index = mimeData->property("TabIndex").toInt(); int dropIndex = mimeData->property("TabDropIndex").toInt(); if (customTabBar && customTabBar->objectName() == "ElaCustomTabBar") { customTabBar->removeTab(index); } q->insertTab(dropIndex, dragWidget, tabIcon, tabText); if (_customTabBar) { dragWidget->setProperty("CurrentCustomBar", QVariant::fromValue(_customTabBar)); _customTabBar->insertTab(dropIndex, tabIcon, tabText); } } void ElaTabWidgetPrivate::onTabCloseRequested(int index) { Q_Q(ElaTabWidget); QWidget* closeWidget = q->widget(index); ElaTabWidget* originTabWidget = closeWidget->property("ElaOriginTabWidget").value(); if (originTabWidget && originTabWidget != q) { ElaTabBar* customTabBar = closeWidget->property("CurrentCustomBar").value(); if (customTabBar) { customTabBar->removeTab(index); closeWidget->setProperty("CurrentCustomBar", QVariant::fromValue(nullptr)); } originTabWidget->addTab(closeWidget, q->tabIcon(index), q->tabText(index)); } else if (!originTabWidget && q->objectName() == "ElaCustomTabWidget") { _customTabBar->removeTab(index); q->removeTab(index); closeWidget->deleteLater(); } else { q->removeTab(index); closeWidget->deleteLater(); } }