QTabBar拖放标签并保持移动标签而无需释放鼠标

时间:2020-09-10 14:09:00

标签: python-3.x drag-and-drop pyqt5 qtabbar

问题标题可能似乎还不清楚:我想要做的是在窗口之间拖放选项卡(我可以这样做),但是当我将选项卡拖到新窗口中时,我希望能够可以在窗口内连续拖动此选项卡,也可以在不释放鼠标的情况下将其拖出窗口。此刻,我必须释放鼠标,然后再次单击选项卡并将其拖动。到目前为止,这是我的代码:

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys

from random import randint

class MainWindow(QMainWindow):
    def __init__(self,parent=None,start={},*args,**kwargs):
        QMainWindow.__init__(self,parent,*args,**kwargs)

        self.tabs = TabWidget(self)
        self.tabs.setTabBar(TabBar(self.tabs))
        self.tabs.tabBar().setMovable(True)

        if not start:
            self.tabs.addTab(QWidget(styleSheet="background-color:red"),"red")
            self.tabs.addTab(QWidget(styleSheet="background-color:orange"),"orange")
            self.tabs.addTab(QWidget(styleSheet="background-color:yellow"),"yellow")
            self.tabs.addTab(QWidget(styleSheet="background-color:green"),"green")
            self.tabs.addTab(QWidget(styleSheet="background-color:blue"),"blue")
            self.tabs.addTab(QWidget(styleSheet="background-color:purple"),"purple")
        else:
            self.tabs.addTab(start["W"],start["T"])

        self.setCentralWidget(self.tabs)

        self.setGeometry(randint(0,1000),randint(0,500),200,100)
        self.show()


class TabWidget(QTabWidget):
    def __init__(self,parent,*args,**kwargs):
        QTabWidget.__init__(self,parent,*args,**kwargs)


class TabBar(QTabBar):
    def __init__(self,parent,*args,**kwargs):
        QTabBar.__init__(self,parent,*args,**kwargs)
        self.tabTransfer = False

    def mouseMoveEvent(self,event):
        globalPosition = self.mapToGlobal(event.pos())

        #Drag out of window
        if not self.geometry().contains(event.pos()):
            targetTabBar = app.widgetAt(globalPosition)
            if type(targetTabBar) == TabBar and not self.tabTransfer:
                self.tabTransfer = True
                currentIndex = self.currentIndex()
                currentWidget = self.parent().widget(currentIndex)
                currentText = self.parent().tabText(currentIndex)

                targetIndex = targetTabBar.tabAt(targetTabBar.mapFromGlobal(globalPosition))
                targetTabBar.parent().insertTab(targetIndex,currentWidget,currentText)
                targetTabBar.setCurrentIndex(targetIndex)
                targetTabBar.setFocus()

                targetTabBar.mouseMoveEvent(event)

        super().mouseMoveEvent(event)

    def mouseReleaseEvent(self,event):
        self.tabTransfer = False

        globalPosition = self.mapToGlobal(event.pos())
        targetTabBar = app.widgetAt(globalPosition)

        if not targetTabBar:
            window = MainWindow(start={"W":self.parent().widget(self.currentIndex()),"T":self.parent().tabText(self.currentIndex())})
            windows.append(window)

        super().mouseReleaseEvent(event)

def excepthook(e,v,t):
    sys.__excepthook__(e,v,t)


if __name__ == "__main__":
    sys.excepthook = excepthook
    app = QApplication(sys.argv)
    window1 = MainWindow(start={})
    window2 = MainWindow(start={})
    window3 = MainWindow(start={})
    windows = [window1,window2,window3]
    app.exec_()

我尝试将鼠标移动事件发送到targetTabBar,并尝试直接在mouseMoveEvent中调用targetTabBar(这可能是个坏主意),但似乎没有任何结果使标签移到新窗口后可以连续移动。此刻,我必须释放并重新单击选项卡以再次移动它。如何在不重新单击标签的情况下使标签保持可移动状态?也就是说,我希望能够将选项卡移动到新窗口中,然后在该选项卡栏中将其滑动或在不释放鼠标的情况下再次将其移动到新窗口中。

0 个答案:

没有答案