问题描述
问题标题可能似乎还不清楚:我想要做的是在窗口之间拖放选项卡(我可以这样做),但是当我将选项卡拖到新窗口中时,我希望能够可以在窗口内连续拖动此选项卡,也可以在不释放鼠标的情况下将其拖出窗口。此刻,我必须释放鼠标,然后再次单击选项卡并将其拖动。到目前为止,这是我的代码:
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,**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,**kwargs):
QTabWidget.__init__(self,**kwargs)
class TabBar(QTabBar):
def __init__(self,**kwargs):
QTabBar.__init__(self,**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,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
(这可能是个坏主意),但似乎没有任何结果使标签移到新窗口后可以连续移动。此刻,我必须释放并重新单击选项卡以再次移动它。如何在不重新单击标签的情况下使标签保持可移动状态?也就是说,我希望能够将选项卡移动到新窗口中,然后在该选项卡栏中将其滑动或在不释放鼠标的情况下再次将其移动到新窗口中。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)