QToolButton单击的信号仅被调用一次

时间:2018-12-22 02:06:34

标签: python pyqt qtoolbutton

我在QToolButton上附加了一个QMenu,在该菜单中菜单不能正确显示。

我正在通过读取.txt文件来填充QMenu。菜单在第一次运行时显示正确的项目,但是如果我在.txt文件中进行了更改并再次单击按钮,则QMenu在第一次运行时仍显示该项目。

此外,似乎clicked信号只被调用了一次?

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.clicked.connect(self.set_menu)

        #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):
        with open('/Desktop/item_file.txt') as f:
            menu_options = f.read().splitlines()
            print menu_options

        qmenu = QtGui.QMenu(self.add_button)
        for opt in menu_options:
            qmenu.addAction(opt, partial(self.set_new_tab, opt))

        self.add_button.setMenu(qmenu)
        self.add_button.setPopupMode(QtGui.QToolButton.InstantPopup)

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

1 个答案:

答案 0 :(得分:1)

QPushButton中建立菜单后,mousePressEvent事件不再到达QPushButton,而是被QMenu拦截,因此不会发出单击信号。

一种解决方案是默认设置QMenu并使用aboutToShow信号调用set_menu来添加QAction

另一方面,它们是相同的,因为不会发出单击,因此不会调用set_menu,即使您按我已经建立的方法调用set_menu,重用也比create更好,因此在这种情况下,我使用清除方法。

from functools import partial
from PyQt4 import QtCore, 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.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)

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