PyQt QTabBar не создает новые вкладки - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь добавить новые вкладки в QTabBar, и это не удалось.

Я пытаюсь добиться того, чтобы при нажатии на значок «Добавить» появилось 3 пункта меню.В зависимости от того, какой элемент выбран, он будет создавать новую вкладку помимо значка «Добавить».

Например, если я выбрал опцию - food, графический интерфейс будет выглядеть примерно так:

| + | food |

В моем set_new_tab(), хотя он, кажется, распечатал выбранную мной опцию, addTab, похоже, ничего не делает.

Интересноесли я что-то упустил, или если QTabBar следует использовать вместе с QTabWidget?

Это мой код:

class MyWin(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MyWin, self).__init__()

        self.tab_bar = QtGui.QTabBar()
        self.add_button = QtGui.QToolButton(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
        )

    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):
        print ">>> opt clicked on : ", opt
        self.tab_bar.addTab(opt) # This does not seems to creating new tabs..

Благодарим за любые советы.

1 Ответ

0 голосов
/ 21 декабря 2018

Проблема не в том, чтобы создавать вкладки, а в том, что размер вкладки невелик и находится за кнопкой, поэтому решение заключается в использовании макетов для правильного размещения виджетов.

from functools import partial
from PyQt4 import QtGui

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):
        print(">>> opt clicked on : ", opt)
        self.tab_bar.addTab(opt)

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    w = MyWin()
    w.show()
    sys.exit(app.exec_())
...