QToolButton click показывает всплывающее меню, пока не нажмете где-нибудь - PullRequest
0 голосов
/ 31 января 2019

У меня есть QToolButton, к которому прикреплено QMenu, где параметры заполняются при чтении файла.

В настоящее время я закодировал его для заполнения / создания вкладок при первом запуске инструмента.Однако у меня возникла проблема с QToolButton, когда мне нужно инициализировать .click() для фактического заполнения пунктов меню, прежде чем я смогу выполнить итерации действий QMenu.

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

Пробовал с помощью .animateClick(10), и та же проблема тоже ...

Примерсодержимого файла:

coke
water
tea

И в случае, если я добавлю что-то новое в файл, я все равно могу нажать на кнопку и добавить оттуда новую опцию.

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

    def ui_setup(self):
        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.qmenu = QtGui.QMenu(self.add_button)
        self.add_button.setMenu(self.qmenu)
        self.add_button.setPopupMode(QtGui.QToolButton.InstantPopup)

        self.qmenu.aboutToShow.connect(self.set_menu)

        self.tab_bar.setTabButton(
            0,
            QtGui.QTabBar.ButtonPosition.RightSide,
            self.add_button
        )

        hlay.addWidget(self.add_button)
        hlay.addWidget(self.tab_bar)

    @QtCore.pyqtSlot()
    def set_menu(self):
        with open('/Desktop/item_file.txt') as f:
            menu_options = f.read().splitlines()
            self.qmenu.clear()
            for opt in menu_options:
                self.qmenu.addAction(opt, partial(self.set_new_tab, opt))

    def set_new_tab(self, opt):
        self.tab_bar.addTab(opt)

    def populate_tabs_at_start(self):
        # need to click on the button to derive the menu
        self.add_button.click()

        # The menu does pops up but it did not go away which I thought it will,
        # unless I perform a mouse-click somewhere within my screen
        #self.add_button.animateClick(10)

        # get the menu actions within self.qmenu
        menu_actions = self.qmenu.actions()
        for act in menu_actions:
            self.set_new_tab(act)

Кроме того, есть ли лучший способ обрабатывать / создавать вкладки, как я подробно описал в populate_tabs_at_start()?

...