![]() |
QTabBar Indexing is wrong for right mouse click - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: GUI (https://python-forum.io/forum-10.html) +--- Thread: QTabBar Indexing is wrong for right mouse click (/thread-15109.html) |
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. |