<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Excellent, I can work with that.</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Great starting point example and suggestions!</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Thanks Maurizio<br>
</div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Maurizio Berti <maurizio.berti@gmail.com><br>
<b>Sent:</b> Thursday, April 11, 2019 10:10 PM<br>
<b>To:</b> Matic Kukovec<br>
<b>Cc:</b> pyqt@riverbankcomputing.com<br>
<b>Subject:</b> Re: [PyQt] QTabWidget tab movement?</font>
<div> </div>
</div>
<div>
<div dir="ltr">
<div dir="ltr">This should do the trick:
<div><br>
</div>
<div>
<div><font face="monospace, monospace">class TabWidget(QtWidgets.QTabWidget):</font></div>
<div><font face="monospace, monospace">    moveRange = None</font></div>
<div><font face="monospace, monospace"><br>
</font></div>
<div><font face="monospace, monospace">    def setMovable(self, movable):</font></div>
<div><font face="monospace, monospace">        if movable == self.isMovable():</font></div>
<div><font face="monospace, monospace">            return</font></div>
<div><font face="monospace, monospace">        QtWidgets.QTabWidget.setMovable(self, movable)</font></div>
<div><font face="monospace, monospace">        if movable:</font></div>
<div><font face="monospace, monospace">            self.tabBar().installEventFilter(self)</font></div>
<div><font face="monospace, monospace">        else:</font></div>
<div><font face="monospace, monospace">            self.tabBar().removeEventFilter(self)</font></div>
<div><font face="monospace, monospace"><br>
</font></div>
<div><font face="monospace, monospace">    def eventFilter(self, source, event):</font></div>
<div><font face="monospace, monospace">        if source == self.tabBar():</font></div>
<div><font face="monospace, monospace">            if event.type() == QtCore.QEvent.MouseButtonPress and event.buttons() == QtCore.Qt.LeftButton:</font></div>
<div><font face="monospace, monospace">                QtCore.QTimer.singleShot(0, self.setMoveRange)</font></div>
<div><font face="monospace, monospace">            elif event.type() == QtCore.QEvent.MouseButtonRelease:</font></div>
<div><font face="monospace, monospace">                self.moveRange = None</font></div>
<div><font face="monospace, monospace">            elif event.type() == QtCore.QEvent.MouseMove and self.moveRange is not None:</font></div>
<div><font face="monospace, monospace">                if event.x() < self.moveRange[0] or event.x() > self.tabBar().width() - self.moveRange[1]:</font></div>
<div><font face="monospace, monospace">                    return True</font></div>
<div><font face="monospace, monospace">        return QtWidgets.QTabWidget.eventFilter(self, source, event)</font></div>
<div><font face="monospace, monospace"><br>
</font></div>
<div><font face="monospace, monospace">    def setMoveRange(self):</font></div>
<div><font face="monospace, monospace">        tabRect = self.tabBar().tabRect(self.currentIndex())</font></div>
<div><font face="monospace, monospace">        pos = self.tabBar().mapFromGlobal(QtGui.QCursor.pos())</font></div>
<div><font face="monospace, monospace">        self.moveRange = pos.x() - tabRect.left(), tabRect.right() - pos.x()</font></div>
</div>
<div><br>
</div>
<div>The delayed setMoveRange() is required since the position of the tab might change if you have tabs that would take more space than available for the QTabBar and the clicked tab is not fully visible.<br>
Keep also in mind that, if that's the case, it might create some issues while moving tabs beyond the limit.</div>
<div>Also, if you move the mouse too fast beyond the limit, the selected bar will be "stuck" according to the last accepted mouseMoveEvent. Maybe this could be fixed by sending a fake QMouseEvent, but I'm not that sure it would make things "easier" (you should
 ensure that the tabRect is not yet at the edge of the QTabBar before).<br>
To avoid all that you should probably work harder by subclassing your own QTabBar and then implement mouseMoveEvent all by yourself, but this would also require some very difficult management of the paintEvent too.<br>
</div>
<div>Also, remember that I didn't take into account margins added by styles, nor the possibility of cornerWidget(s).</div>
<div><br>
</div>
<div>Maurizio</div>
<div><br>
</div>
</div>
</div>
<br>
<div class="x_gmail_quote">
<div dir="ltr" class="x_gmail_attr">Il giorno gio 11 apr 2019 alle ore 21:23 Matic Kukovec <<a href="mailto:kukovecmatic@hotmail.com">kukovecmatic@hotmail.com</a>> ha scritto:<br>
</div>
<blockquote class="x_gmail_quote" style="margin:0px 0px 0px 0.8ex; border-left:1px solid rgb(204,204,204); padding-left:1ex">
<div dir="ltr">
<div style="font-family:Calibri,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
Hi,</div>
<div style="font-family:Calibri,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<br>
</div>
<div style="font-family:Calibri,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
Is there a way to change the behavior and animation of a QTabWidgets tab bar drag functionality?</div>
<div style="font-family:Calibri,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<img size="43989" style="max-width:100%" data-outlook-trace="F:1|T:1" src="cid:16a0dfa0c4264cee6f1"></div>
<div style="font-family:Calibri,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
In the above image you can see that the dragged tab disappears outside the bounds of the tab bar.<br>
</div>
<div style="font-family:Calibri,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
I would like to remove the movement of tabs outside the tab bar space.</div>
<div style="font-family:Calibri,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<br>
</div>
<div style="font-family:Calibri,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
Can anyone suggest of where to begin in changing this behavior?</div>
<div style="font-family:Calibri,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<br>
</div>
<div style="font-family:Calibri,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
Thanks,</div>
<div style="font-family:Calibri,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
Matic<br>
</div>
</div>
_______________________________________________<br>
PyQt mailing list    <a href="mailto:PyQt@riverbankcomputing.com" target="_blank">
PyQt@riverbankcomputing.com</a><br>
<a href="https://www.riverbankcomputing.com/mailman/listinfo/pyqt" rel="noreferrer" target="_blank">https://www.riverbankcomputing.com/mailman/listinfo/pyqt</a><br>
</blockquote>
</div>
<br clear="all">
<div><br>
</div>
-- <br>
<div dir="ltr" class="x_gmail_signature">È difficile avere una convinzione precisa quando si parla delle ragioni del cuore. - "Sostiene Pereira", Antonio Tabucchi<br>
<a href="http://www.jidesk.net" target="_blank">http://www.jidesk.net</a></div>
</div>
</body>
</html>