gpt4 book ai didi

python - QToolButton 单击信号仅调用一次

转载 作者:行者123 更新时间:2023-12-01 08:31:44 26 4
gpt4 key购买 nike

我已将 QMenu 附加到 QToolButton,但菜单未正确反射(reflect)。

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

最佳答案

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

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

另一方面,它们是相同的,因为未发出 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_())

关于python - QToolButton 单击信号仅调用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53892516/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com