2017-09-24 6 views
2

これをアーカイブするにはどうすればいいですか: - 分割されたウィジェットのtabBarから別のtabBarにタブをドラッグアンドドロップする必要がありますか? 私はすでにQtabBarをサブクラス化し、ドラッグアンドドロップイベントを実装しています。私は既に右のpixmapなどでドラッグすることができます。また、同じTabBarにドロップできますが、他のオブジェクトにはドロップできません。 出力は正しい引数を提供していないことを私に伝えます。ここではコードを示します。それを単純化して例を示し、さらにウィンドウの.JPGを加えたものです。タブをQtabBarから分割されたウィジェットの他の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イムは、ドラッグアンドドロップイベントをやってサブクラスです。

IMAGE - >EXAMPLE

+0

QDockWidgetsの使用を検討しましたか?彼らはタブで人の周りをドラッグすることができます – SteakOverflow

+0

ええ私はそのようにそれを試して、私はそれをしましたが、私が探していた方法ではありません..私は私の頭の中に、そしてまあ、 12時間以上経って今結果を投稿しようと思っています:)そしてあなたの提案にとても感謝しています。 @SteakOverflow –

答えて

3

は、多くの時間後およびWeb上で今日のQtの多くmanyyyyページを食べた、私は私の方法でそれをやった、今私は、他の1つのタブバーからタブをドラッグ&ドロップすることができますし、その逆も同様です。現在のタブの選択だけではなく、タブバーに必要なすべてのタブを選択して、小さなタブのピクスマップをドラッグして表示できます。

ここにコードは

です

**編集**

私はそれをもっと弾丸にしました、私はインデックスで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

共有してくれてありがとう! –

関連する問題