2017-09-24 80 views
2

我怎樣才能存檔這個: - 我需要拖放一個tabBar選項卡到其他tabBar在拆分的小部件? 我已經子類化QtabBar並實現拖放事件,我已經可以拖動它與正確的像素圖等,也可以放入相同的tabBar,但不在另一個.. 得到這個錯誤輸出告訴我,我沒有提供正確的參數,這裏是代碼,我簡化了它,例如,加上窗口的.JPG。將一個Tab從QtabBar拖放到一個拆分的Widget中的其他QtabBar Qt

class EsceneTest(qg.QMainWindow): 
    def __init__(self,parent=getMayaWindow()): 
     super(EsceneTest,self).__init__(parent) 
     #---------------------------------------------------------#   
     #check for open Window first 
     winName = windowTitle 
     if cmds.window(winName, exists =1): 
      cmds.deleteUI(winName, wnd=True) 

     self.setAttribute(qc.Qt.WA_DeleteOnClose) 
     self._initUI()  

    def _initUI(self):      
     self.setObjectName(windowObject) 
     self.setWindowTitle(windowTitle) 
     self.setMinimumWidth(450) 
     self.setMinimumHeight(500) 
     self.resize(1080, 800) # re-size the window 
     centralWidget = qg.QWidget() 
     centralWidget.setObjectName('centralWidget') 
     self.setCentralWidget(centralWidget) 
     central_layout = qg.QVBoxLayout(centralWidget) 

     ###################### 
     # tab container 
     # 
     self.tabWidget = qg.QTabWidget() 
     self.tabWidget.setAcceptDrops(True) 
     self.tab_layout = qg.QVBoxLayout(self.tabWidget) 
     central_layout.addWidget(self.tabWidget) 

     ####################### 
     # TabBar 
     #     
     custom_tabbar = ColtabBar() 
     self.tabWidget.setTabBar(custom_tabbar)   

     ####################### 
     # ViewportTab 
     #   
     tabCentral_wdg = qg.QWidget() 
     self.top_lyt = qg.QVBoxLayout(tabCentral_wdg) 
     self.tab_layout.addLayout(self.top_lyt)  

     fixedHBox_lyt = qg.QHBoxLayout() 
     self.top_lyt.addLayout(fixedHBox_lyt) 
     self.tabWidget.addTab(tabCentral_wdg,'- Viewport') 

     ####################### 
     # Example ExtraTab 
     #   
     tabTwo_wdg = qg.QWidget() 
     tabTwo_wdg_lyt = qg.QHBoxLayout(tabTwo_wdg) 
     self.tab_layout.addLayout(tabTwo_wdg_lyt)   
     label = qg.QLabel(' -- This is an example -- ') 
     label.setStyleSheet(""" 
          background : qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(53, 57, 60), stop:1 rgb(33, 34, 36)); 
          border-style : none; 
          font-size: 40px; 
          font-family: Calibri; 
          color : rgb(200,200,100); 
         """) 
     label.setAlignment(qc.Qt.AlignVCenter | qc.Qt.AlignHCenter) 
     tabTwo_wdg_lyt.addWidget(label)  
     tab_panel_lyt = qg.QVBoxLayout(label)  
     self.tabWidget.addTab(tabTwo_wdg,'- ExtraExample') 

     ############################ 
     # Q Splitter Widget to insert the dragged Tabs 
     # 
     split = qg.QSplitter(qc.Qt.Orientation.Vertical, self) 
     central_layout.addWidget(split) 
     tab_splitted = qg.QTabWidget() 
     split.setLayout(qg.QVBoxLayout()) 
     split.insertWidget(0,tab_splitted) 
     tabBar_2 = ColtabBar() 
     tab_splitted.setTabBar(tabBar_2) 
     tabBar_2.addTab('- Insert-Here') 
#---------------------------------------------------------------------------------------------# 

class ColtabBar(qg.QTabBar): 
    def __init__(self): 
     super(ColtabBar, self).__init__() 
     self.indexTab = None   
     self.setAcceptDrops(True) 

    ################################## 
    # Events 
    def mouseMoveEvent(self, e): 
     if e.buttons() != qc.Qt.MiddleButton: 
      return 

     globalPos = self.mapToGlobal(e.pos()) 
     posInTab = self.mapFromGlobal(globalPos) 
     self.indexTab = self.tabAt(e.pos()) 
     tabRect = self.tabRect(self.indexTab) 


     pixmap = qg.QPixmap(tabRect.size()) 
     self.render(pixmap,qc.QPoint(),qg.QRegion(tabRect)) 
     mimeData = qc.QMimeData() 
     drag = qg.QDrag(self) 
     drag.setMimeData(mimeData) 
     drag.setPixmap(pixmap) 

     cursor = qg.QCursor(qc.Qt.OpenHandCursor)  
     drag.setHotSpot(e.pos() - posInTab) 
     drag.setDragCursor(cursor.pixmap(),qc.Qt.MoveAction)  
     dropAction = drag.exec_(qc.Qt.MoveAction) 


    def mousePressEvent(self, e): 
     #super(qg.QWidget).mousePressEvent(e) 
     if e.button() == qc.Qt.RightButton: 
      print('press') 

     if e.button() == qc.Qt.LeftButton:    
      globalPos = self.mapToGlobal(e.pos()) 
      posInTab = self.mapFromGlobal(globalPos) 
      self.indexTab = self.tabAt(e.pos()) 
      self.setCurrentIndex(self.indexTab) 

    def dragEnterEvent(self, e): 
     e.accept() 


    def dropEvent(self, e): 
     e.setDropAction(qc.Qt.MoveAction) 
     e.accept()   
     self.insertTab(self.indexTab, self.tabText(self.indexTab)) 
     self.removeTab(self.indexTab) 

ColtabBar就是即時通訊做的拖放事件的子類。

圖片 - >EXAMPLE

+0

您是否考慮使用QDockWidgets?他們可以被標籤和用戶拖動 – SteakOverflow

+0

是的,我嘗試了這種方式,我做到了,但並不是我一直在尋找的方式..我喜歡做我喜歡做的事情,然後在我的腦海中,最後做到了它,超過12小時ufff會發布結果現在:)並非常感謝youuu您的建議。 @SteakOverflow –

回答

3

多小時後吃的Qt的許多manyyyy頁今天在網上,我做到了我的路,現在我可以將它從一個的TabBar下降標籤對另反之亦然,而不僅僅是從選擇當前標籤,我可以選擇我想要在我的標籤欄中的每個標籤,並將拖動時顯示小標籤的像素圖...

這裏是代碼:

**編輯**

我做了更多的防彈措施,當我在索引中使用多於2個選項卡時,出現了一個錯誤,現在效果更好,當我將它放在同一個小部件中時,它會返回事件並且不執行代碼,另外懸停選項卡用鼠標右鍵也是..我希望這可以幫助任何人在未來。

TABINDEX = int() 

def getTabIndex(index): 
    global TABINDEX 
    if index == -1 or index == TABINDEX: 
     return 
    TABINDEX = index 
    print (TABINDEX) 
    return TABINDEX 


class ColtTab(qg.QTabWidget): 
    def __init__(self): 
     super(ColtTab,self).__init__() 
     self.setAcceptDrops(True) 
     self.tabBar = self.tabBar() 
     self.tabBar.setMouseTracking(True) 
     self.setDocumentMode(True) 
     self.indexTab = int() 
     self.setMovable(True) 
     self.setStyleSheet(style_sheet_file) 


    # test for hovering and selecting tabs automatic while mouser over then - not working for now... 
    def eventFilter(self, obj, event): 
     if obj == self.tabBar: 
      if event.type() == qc.QEvent.MouseMove: 
       index=self.tabBar.tabAt(event.pos()) 
       self.tabBar.setCurrentIndex (index) 
       return True 
      else: 
       return 
     else: 
      return 

    ################################## 
    # Events 
    # 
    def mouseMoveEvent(self, e): 
     if e.buttons() != qc.Qt.MiddleButton: 
      return 

     globalPos = self.mapToGlobal(e.pos()) 
     #print(globalPos) 
     tabBar = self.tabBar 
     #print(tabBar) 
     posInTab = tabBar.mapFromGlobal(globalPos) 
     #print(posInTab) 
     self.indexTab = tabBar.tabAt(e.pos()) 
     #print(self.indexTab) 
     tabRect = tabBar.tabRect(self.indexTab) 
     #print(tabRect) 
     #print(tabRect.size()) 

     pixmap = qg.QPixmap(tabRect.size()) 
     tabBar.render(pixmap,qc.QPoint(),qg.QRegion(tabRect)) 
     mimeData = qc.QMimeData() 
     drag = qg.QDrag(tabBar) 
     drag.setMimeData(mimeData) 
     drag.setPixmap(pixmap) 
     cursor = qg.QCursor(qc.Qt.OpenHandCursor) 
     drag.setHotSpot(e.pos() - posInTab) 
     drag.setDragCursor(cursor.pixmap(),qc.Qt.MoveAction) 
     dropAction = drag.exec_(qc.Qt.MoveAction) 


    def mousePressEvent(self, e): 
     if e.button() == qc.Qt.RightButton: 
      self.tabBar.installEventFilter(self) 
      print('Right button pressed') 

     super(ColtTab, self).mousePressEvent(e) 


    def dragEnterEvent(self, e): 
     e.accept() 
     if e.source().parentWidget() != self: 
      return 

     # Helpper function for retreaving the Tab index into a global Var 
     getTabIndex(self.indexOf(self.widget(self.indexTab))) 


    def dragLeaveEvent(self,e): 
     e.accept() 


    def dropEvent(self, e): 
     if e.source().parentWidget() == self: 
      return 

     e.setDropAction(qc.Qt.MoveAction) 
     e.accept() 
     counter = self.count() 

     if counter == 0: 
      self.addTab(e.source().parentWidget().widget(TABINDEX),e.source().tabText(TABINDEX)) 
     else: 
      self.insertTab(counter + 1 ,e.source().parentWidget().widget(TABINDEX),e.source().tabText(TABINDEX)) 

     print ('Tab dropped') 

    def mouseReleaseEvent(self, e): 
     if e.button() == qc.Qt.RightButton: 
      print('Right button released') 
      self.tabBar.removeEventFilter(self) 

     super(ColtTab, self).mouseReleaseEvent(e) 


    #---------------------------------------------------------------------------------# 

的圖像 - >

Example :

1

找到該線程是有用的。使用您的解決方案在PyQt5中創建一個自包含的通用示例。可以幫助未來的人。

import sys 

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

class Tabs(QTabWidget): 
    def __init__(self, parent): 
     super().__init__(parent) 
     self.parent = parent 
     self.setAcceptDrops(True) 
     self.tabBar = self.tabBar() 
     self.tabBar.setMouseTracking(True) 
     self.indexTab = None 
     self.setMovable(True) 

     self.addTab(QWidget(self), 'Tab One') 
     self.addTab(QWidget(self), 'Tab Two') 

    def mouseMoveEvent(self, e): 
     if e.buttons() != Qt.RightButton: 
      return 

     globalPos = self.mapToGlobal(e.pos()) 
     tabBar = self.tabBar 
     posInTab = tabBar.mapFromGlobal(globalPos) 
     self.indexTab = tabBar.tabAt(e.pos()) 
     tabRect = tabBar.tabRect(self.indexTab) 

     pixmap = QPixmap(tabRect.size()) 
     tabBar.render(pixmap,QPoint(),QRegion(tabRect)) 
     mimeData = QMimeData() 
     drag = QDrag(tabBar) 
     drag.setMimeData(mimeData) 
     drag.setPixmap(pixmap) 
     cursor = QCursor(Qt.OpenHandCursor) 
     drag.setHotSpot(e.pos() - posInTab) 
     drag.setDragCursor(cursor.pixmap(),Qt.MoveAction) 
     dropAction = drag.exec_(Qt.MoveAction) 


    def dragEnterEvent(self, e): 
     e.accept() 
     if e.source().parentWidget() != self: 
      return 

     print(self.indexOf(self.widget(self.indexTab))) 
     self.parent.TABINDEX = self.indexOf(self.widget(self.indexTab)) 


    def dragLeaveEvent(self,e): 
     e.accept() 


    def dropEvent(self, e): 
     print(self.parent.TABINDEX) 
     if e.source().parentWidget() == self: 
      return 

     e.setDropAction(Qt.MoveAction) 
     e.accept() 
     counter = self.count() 

     if counter == 0: 
      self.addTab(e.source().parentWidget().widget(self.parent.TABINDEX),e.source().tabText(self.parent.TABINDEX)) 
     else: 
      self.insertTab(counter + 1 ,e.source().parentWidget().widget(self.parent.TABINDEX),e.source().tabText(self.parent.TABINDEX)) 


class Window(QWidget): 
    def __init__(self): 

     super().__init__() 

     self.TABINDEX = 0 
     tabWidgetOne = Tabs(self) 
     tabWidgetTwo = Tabs(self) 

     layout = QHBoxLayout() 

     self.moveWidget = None 

     layout.addWidget(tabWidgetOne) 
     layout.addWidget(tabWidgetTwo) 

     self.setLayout(layout) 

if __name__ == '__main__': 

    app = QApplication(sys.argv) 
    window = Window() 
    window.show() 
    sys.exit(app.exec_()) 
+0

甜蜜的感謝分享! –

相關問題