Qt Designer中的自定义菜单操作

3
我目前正在使用Qt Designer构建GUI,并且想要自定义菜单操作的槽。

例如:我希望用户按下菜单动作,如果部件已隐藏,则显示它;如果已经可见,则隐藏它。

基本上,我的意思是执行我的代码而不是默认的操作,例如show()或hide()。

因此,我想知道是否应该创建QMenuBar的子类,向其中添加自定义插槽,然后创建插件以在Qt Designer中使用它,还是应该为QMenu或QAction创建子类?或者这并不是正确的方法?

我正在Visual Studio下工作,只使用Qt Designer,没有使用Qt Creator。

我对GUI和Qt编程是新手,我有点迷茫。

提前致谢:)

3个回答

3
您基本上有两个选择:
  1. 在Mainwindow子类中实现自定义逻辑。
    为此,在该类中添加所需的处理槽,并使它们在Qt Designer中可用。您可以这样做:
    要么在Signal / Slot编辑器中单击“修改”,然后单击+符号。通过这种方式,您可以在QtDesigner中提供新的槽;
    或者当您的槽被称为on_(senderName)_(signalName)时,Qt自动连接信号,您不必在代码或设计中进行操作。

  2. 创建QMenuBar子类并在其中实现自定义逻辑。
    对于您的情况,请告诉Qt Designer选择您的特定子类作为默认QMenuBar的替代品,右键单击它,并选择“升级到...”。在新对话框中,您可以指定将在实际代码中用作替换的自定义类,但在设计时间中使用QMenuBar。使用此方法,您无需编写单独的插件即可在Qt Designer中提供您的类。

请注意,使用第二个选项时,只有通过菜单栏触发的操作才会调用您的自定义逻辑,而不是通过快捷键或工具按钮。


谢谢回答,这正是我在寻找的。不过,解决方案2更适合我的需求 :) - Jeff Bencteux

1
在你的类中创建一个插槽:
onMenuActionTriggered()

使用connect()来响应动作的信号:
connect(ui.myAction, SIGNAL(triggered()), this, SLOT(onMenuActionTriggered()));

在您的插槽中,您可以做任何想做的事情。
另一种解决方案(不是我最喜欢的,但是可能的)是使用自动连接功能,这意味着通过声明一个名为'on_myAction_triggered()'的插槽(其中myAction是您的QAction的名称),您不需要使用connect(),因为它已经被Qt自动连接了。

问题是,Qt Designer 中使用的 QMenuBar 是默认的,因此我没有任何它的子类。我的问题(如上所述)是,我是否应该为我想要的内容创建一个子类。 - Jeff Bencteux
信号是由操作而不是菜单栏发出的。因此,通过在设计器中添加操作到菜单中,会自动生成对象,这些对象可以在connect中使用。 - Robert

0
菜单栏会自动添加到任何派生自QMainWindow的新表单中(在创建GUI应用程序时默认使用,但您可以使用文件->新建文件或项目...并选择Qt-> Qt Designer表单类来创建新的主窗口)。
要向其添加选项,只需单击标有“在此处键入”的区域并编写选项文本。这样做会在Qt Designer的下部列表中显示一个操作。右键单击该操作并选择“转到插槽”。它将弹出一个对话框,并已为您选择了“triggered()”,只需单击“确定”,Qt Creator将处理所有详细信息并将您传输到插槽函数的主体中。

谢谢你的回答。问题是我正在Visual Studio下编程,我只使用Qt Designer而不是Qt Creator,并且每次编译都是在VS下完成的,所以我无法右键单击并转到代码。我将编辑问题以使其更准确。 - Jeff Bencteux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接