Python Forum
QTabBar Indexing is wrong for right mouse click - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/Forum-Python-Coding)
+--- Forum: GUI (https://python-forum.io/Forum-GUI)
+--- Thread: QTabBar Indexing is wrong for right mouse click (/Thread-QTabBar-Indexing-is-wrong-for-right-mouse-click)



QTabBar Indexing is wrong for right mouse click - xenas - Jan-04-2019

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.

Here is my code:
class MyWin(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MyWin, self).__init__()
        central_widget = QtGui.QWidget()
        self.setCentralWidget(central_widget)
        vlay = QtGui.QVBoxLayout(central_widget)
        hlay = QtGui.QHBoxLayout()
        vlay.addLayout(hlay)
        vlay.addStretch()

        self.add_button = QtGui.QToolButton()
        self.tab_bar = QtGui.QTabBar(self)
        self.add_button.setIcon(QtGui.QIcon('add.png'))
        self.add_button.setMenu(self.set_menu())
        self.add_button.setPopupMode(QtGui.QToolButton.InstantPopup)

        self.tab_bar.setTabButton(
            0,
            QtGui.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 = QtGui.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)

    def mousePressEvent(self, event):
        if event.button() == QtCore.Qt.RightButton:
            index = self.tab_bar.tabAt(event.pos())
            print index
            menu = QtGui.QMenu(self)
            action = menu.addAction('Remove tab', partial(self.removal_tab, index))
        else:
            super(MyWin, self).mousePressEvent(event)
    
    def removal_tab(self, index):
        self.tab_bar.removeTab(index)


my_win = MyWin()
my_win.show()
Appreciate for any insights and many thanks in advance for any response!


RE: QTabBar Indexing is wrong for right mouse click - Axel_Erfurt - Jan-04-2019

That's only a part of the code.

what is opt, partial ?

and I miss something like this at the end

if __name__ == '__main__':
    import sys
    app = GtGui.QApplication(sys.argv)
    my_win = MyWin()
    my_win.show()
    app.exec()



RE: QTabBar Indexing is wrong for right mouse click - xenas - Jan-04-2019

Hi Axel,

partial are part of the import module that I did not added in my above code.
And so it should be (I can't seem to find the 'edit; to my post):
from functools import partial

class MyWin(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MyWin, self).__init__()
        central_widget = QtGui.QWidget()
        self.setCentralWidget(central_widget)
        vlay = QtGui.QVBoxLayout(central_widget)
        hlay = QtGui.QHBoxLayout()
        vlay.addLayout(hlay)
        vlay.addStretch()
 
        self.add_button = QtGui.QToolButton()
        self.tab_bar = QtGui.QTabBar(self)
        self.add_button.setIcon(QtGui.QIcon('add.png'))
        self.add_button.setMenu(self.set_menu())
        self.add_button.setPopupMode(QtGui.QToolButton.InstantPopup)
 
        self.tab_bar.setTabButton(
            0,
            QtGui.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 = QtGui.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)
 
    def mousePressEvent(self, event):
        if event.button() == QtCore.Qt.RightButton:
            index = self.tab_bar.tabAt(event.pos())
            print index
            menu = QtGui.QMenu(self)
            action = menu.addAction('Remove tab', partial(self.removal_tab, index))
        else:
            super(MyWin, self).mousePressEvent(event)
     
    def removal_tab(self, index):
        self.tab_bar.removeTab(index)
 
 
my_win = MyWin()
my_win.show()
opt is part of the menu options as stated in line 28.
This is a complete code despite I did not added in the execution code as you have defined, as the tool is still operatable.