Hi all, I am trying to grab ahold of the mouse position + right mouse click on QTabBar where it will pops up a message to User if they want to remove the said tab.
(Pardon the vague design) This is what my QTabBar looks like: | + | food | snacks | drinks |
However, in my following code, whenever I tried to print out the index as I do a right-mouse click on the tabs, the returned index value is wrong.
It seems to have taken into account of the ‘+’ button as it is indicating as index 0 where index 0 should actually starts from the ‘food’ tab onwards.
I’ve checked what was going on.
So basically the event.pos() was giving you the “wrong coordinates” since it was on the parent widget.
The tabAt wants the coordinates in is own widget space, so rather than calculating the offset that can be tricky I’ve just subclassed the tab widget.
Now the tab is printed correctly
from PySide2 import QtCore, QtGui, QtWidgets
from maya.app.general.mayaMixin import MayaQWidgetDockableMixin
from functools import partial
import maya.cmds as cmds
class SpecialTab(QtWidgets.QTabBar):
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.RightButton:
index = self.tabAt(event.pos())
print index
else:
super(SpecialTab, self).mousePressEvent(event)
class MyWin(MayaQWidgetDockableMixin, QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MyWin, self).__init__()
central_widget = QtWidgets.QWidget()
self.setCentralWidget(central_widget)
vlay = QtWidgets.QVBoxLayout(central_widget)
hlay = QtWidgets.QHBoxLayout()
vlay.addLayout(hlay)
vlay.addStretch()
self.add_button = QtWidgets.QToolButton()
self.tab_bar = SpecialTab()
self.add_button.setIcon(QtGui.QIcon('add.png'))
self.add_button.setMenu(self.set_menu())
self.add_button.setPopupMode(QtWidgets.QToolButton.InstantPopup)
self.tab_bar.setTabButton(
0,
QtWidgets.QTabBar.ButtonPosition.RightSide,
self.add_button
)
hlay.addWidget(self.add_button)
hlay.addWidget(self.tab_bar)
def set_menu(self):
menu_options = ['food', 'drinks', 'snacks']
qmenu = QtWidgets.QMenu(self.add_button)
for opt in menu_options:
qmenu.addAction(opt, partial(self.set_new_tab, opt))
qmenu.addAction
return qmenu
def set_new_tab(self, opt):
self.tab_bar.addTab(opt)
my_win = MyWin()
my_win.show()