【问题标题】:QToolButton clicked signal is only called onceQToolButton clicked 信号只被调用一次
【发布时间】:2018-12-22 02:06:34
【问题描述】:

我已将 QMenu 附加到菜单未正确反映的 QToolButton。

我正在通过读取 .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)

【问题讨论】:

    标签: python pyqt qtoolbutton


    【解决方案1】:

    当在QPushButton 中建立Menu 时,mousePressEvent 事件不再到达QPushButton 而是被QMenu 拦截,因此不会发出 clicked 信号。

    一种解决方案是默认设置一个 QMenu 并使用 aboutToShow 信号调用 set_menu 将添加 QActions。

    另一方面,它们是相同的,因为 clicked 没有发出,因此 set_menu 没有被调用,即使你像我已经建立的那样调用 set_menu,重用比创建更好,所以在这种情况下,我消除了以前的 QActions清除方法。

    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_())
    

    【讨论】:

    • 谢谢!请问在什么情况下我需要使用@QtCore.pyqtSlot()?我在一些例子中看到过它们,但真的不知道什么时候使用它们……另外,请问是否有一个命令可以让我查询 qmenu 中的所有项目?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 2019-08-23
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多