在 QMenu 的指定位置插入新项目
Slotting in new items at specified positions in QMenu
我正在尝试实现以下 QMenu 设计:
| Add New Item |
------------------
| New Item 1 |
| New Item 2 |
| New Item 3 |
------------------
| Default Item 1 |
| Default Item 2 |
假设它是一个新的 QMenu,默认设计看起来有些谎言:
| Add New Item |
------------------
| Default Item 1 |
| Default Item 2 |
在我的代码中,虽然我能够创建新项目,但我遇到了 2 个问题。
对于我在使用选项 - Add new item
时指定的任何新项目,默认的 3 个选项被重新添加到 QMenu 中,这导致了重复的选项。 . 如果我添加 self.qmenu.clear()
,虽然它解决了重复的默认项目,但不会填充新项目...
是否可以在 add new item
和 default items
之间插入新项目?或者,将 2 个 qmenus 合并为一个,类似于您如何在 QVBoxLayout 中添加小部件,您可以在其中控制顺序?
提前感谢任何见解。
class Example(QtGui.QMainWindow):
def __init__(self, parent=None):
super(Example, self).__init__(parent)
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Context menu')
self.qmenu = QtGui.QMenu()
def contextMenuEvent(self, event):
# self.qmenu.clear()
# For adding in new item(s)
add_item_action = QtGui.QAction('Add new item', self)
slot = functools.partial(self.add_new_item)
add_item_action.triggered.connect(slot)
self.qmenu.addAction(add_item_action)
self.qmenu.addSeparator()
# Default items
def_item_01 = self.qmenu.addAction("Default Item A")
def_item_02 = self.qmenu.addAction("Default Item B")
action = self.qmenu.exec_(self.mapToGlobal(event.pos()))
def add_new_item(self):
new_item_name = raw_input('Name of new item : ')
if new_item_name:
self.qmenu.addSeparator()
# The new items should be checked upon created
new_action = QtGui.QAction(new_item_name, self.qmenu, checkable=True)
new_action.setChecked(True)
self.qmenu.addAction(new_action)
my_win = Example()
my_win.show()
你打了多少次contextMenuEvent
?每次右击都会不断添加默认项,你不觉得只添加一次比较好,以免重复添加吗?,这才是正确的做法。
另一方面,如果您想在 QMenu
中插入项目,则必须使用 insertAction()
。
最后不要使用 raw_input()
(或 python3 中的 input()
),因为它们会阻止和冻结 GUI,最好使用一个对话框,询问您数据。
class Example(QtGui.QMainWindow):
def __init__(self, parent=None):
super(Example, self).__init__(parent)
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Context menu')
self.qmenu = QtGui.QMenu()
add_item_action = QtGui.QAction('Add new item', self,
triggered=self.add_new_item)
self.qmenu.addAction(add_item_action)
self.qmenu.addSeparator()
self.separator = self.qmenu.addSeparator()
# Default items
def_item_01 = self.qmenu.addAction("Default Item A")
def_item_02 = self.qmenu.addAction("Default Item B")
def contextMenuEvent(self, event):
action = self.qmenu.exec_(self.mapToGlobal(event.pos()))
@QtCore.pyqtSlot()
def add_new_item(self):
new_item_name, ok = QtGui.QInputDialog.getText(self, "name of item", "Name of new item : ")
if ok:
new_action = QtGui.QAction(new_item_name, self.qmenu, checkable=True)
self.qmenu.insertAction(self.separator, new_action)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
my_win = Example()
my_win.show()
sys.exit(app.exec_())
我正在尝试实现以下 QMenu 设计:
| Add New Item |
------------------
| New Item 1 |
| New Item 2 |
| New Item 3 |
------------------
| Default Item 1 |
| Default Item 2 |
假设它是一个新的 QMenu,默认设计看起来有些谎言:
| Add New Item |
------------------
| Default Item 1 |
| Default Item 2 |
在我的代码中,虽然我能够创建新项目,但我遇到了 2 个问题。
对于我在使用选项 -
Add new item
时指定的任何新项目,默认的 3 个选项被重新添加到 QMenu 中,这导致了重复的选项。 . 如果我添加self.qmenu.clear()
,虽然它解决了重复的默认项目,但不会填充新项目...是否可以在
add new item
和default items
之间插入新项目?或者,将 2 个 qmenus 合并为一个,类似于您如何在 QVBoxLayout 中添加小部件,您可以在其中控制顺序?
提前感谢任何见解。
class Example(QtGui.QMainWindow):
def __init__(self, parent=None):
super(Example, self).__init__(parent)
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Context menu')
self.qmenu = QtGui.QMenu()
def contextMenuEvent(self, event):
# self.qmenu.clear()
# For adding in new item(s)
add_item_action = QtGui.QAction('Add new item', self)
slot = functools.partial(self.add_new_item)
add_item_action.triggered.connect(slot)
self.qmenu.addAction(add_item_action)
self.qmenu.addSeparator()
# Default items
def_item_01 = self.qmenu.addAction("Default Item A")
def_item_02 = self.qmenu.addAction("Default Item B")
action = self.qmenu.exec_(self.mapToGlobal(event.pos()))
def add_new_item(self):
new_item_name = raw_input('Name of new item : ')
if new_item_name:
self.qmenu.addSeparator()
# The new items should be checked upon created
new_action = QtGui.QAction(new_item_name, self.qmenu, checkable=True)
new_action.setChecked(True)
self.qmenu.addAction(new_action)
my_win = Example()
my_win.show()
你打了多少次contextMenuEvent
?每次右击都会不断添加默认项,你不觉得只添加一次比较好,以免重复添加吗?,这才是正确的做法。
另一方面,如果您想在 QMenu
中插入项目,则必须使用 insertAction()
。
最后不要使用 raw_input()
(或 python3 中的 input()
),因为它们会阻止和冻结 GUI,最好使用一个对话框,询问您数据。
class Example(QtGui.QMainWindow):
def __init__(self, parent=None):
super(Example, self).__init__(parent)
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Context menu')
self.qmenu = QtGui.QMenu()
add_item_action = QtGui.QAction('Add new item', self,
triggered=self.add_new_item)
self.qmenu.addAction(add_item_action)
self.qmenu.addSeparator()
self.separator = self.qmenu.addSeparator()
# Default items
def_item_01 = self.qmenu.addAction("Default Item A")
def_item_02 = self.qmenu.addAction("Default Item B")
def contextMenuEvent(self, event):
action = self.qmenu.exec_(self.mapToGlobal(event.pos()))
@QtCore.pyqtSlot()
def add_new_item(self):
new_item_name, ok = QtGui.QInputDialog.getText(self, "name of item", "Name of new item : ")
if ok:
new_action = QtGui.QAction(new_item_name, self.qmenu, checkable=True)
self.qmenu.insertAction(self.separator, new_action)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
my_win = Example()
my_win.show()
sys.exit(app.exec_())