Qt Designer 中的自定义菜单操作

Posted

技术标签:

【中文标题】Qt Designer 中的自定义菜单操作【英文标题】:Custom menu actions in Qt Designer 【发布时间】:2014-11-12 09:45:45 【问题描述】:

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

例如:我希望用户按下一个菜单操作,如果它是隐藏的,它会显示一个小部件,如果它已经可见,它会隐藏它。

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

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

我在 Visual Studio 下工作,我只使用 Qt Designer,而不是 Qt creator。

我是 GUI 和 Qt 编程的新手,我有点迷路了。

提前致谢:)

【问题讨论】:

【参考方案1】:

你基本上有两个选择:

    在主窗口子类中实现自定义逻辑。 为此,您只需在类中添加处理所需的插槽,并使其在 Qt Designer 中可用。您可以这样做:任一 在信号/槽编辑器中单击“修改”,然后单击 + 符号。这样,您就可以在 QtDesigner 中使用新的插槽;当您的插槽被称为 on_(senderName)_(signalName) 时,Qt 自动装配将自动连接信号,您不必在代码中执行此操作或设计师。

    创建一个 QMenuBar 子类并在那里实现自定义逻辑。 您的案例告诉 Qt Designer 选择您的特定子类作为默认 QMenuBar 的替换,方法是右键单击它,然后选择“Promote to...”。在新对话框中,您可以指定将在实际代码中用作替换的自定义类,但在设计时使用 QMenuBar。使用这种方法,您不必编写单独的插件来使您的类在 Qt Designer 中可用。

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

【讨论】:

感谢您的回答,这就是我要找的。解决方案 2 更适合我的需求 :)【参考方案2】:

在您的班级中创建一个插槽:

onMenuActionTriggered()

使用connect() 对动作信号做出反应:

connect(ui.myAction, SIGNAL(triggered()), this, SLOT(onMenuActionTriggered()));

在你的插槽中,你可以做任何你想做的事情。

另一个解决方案(不是我最喜欢的,但可能的)是使用自动连接功能,这意味着,通过声明一个插槽“on_myAction_triggered()”(其中 myAction 是您的 QAction 的名称),您不需要使用connect(),因为它是由Qt自动连接的

【讨论】:

重点是,Qt Designer 中使用的 QMenuBar 是默认的,所以我没有它的任何子类。我的问题(上面)是我应该为我想要的东西创建一个子类。 信号是由一个动作而不是菜单栏发出的。因此,通过向您的菜单添加操作(通过设计器),可以(自动)生成可以在 connect 中使用的对象【参考方案3】:

菜单栏会自动添加到从 QMainWindow 派生的任何新窗体中(创建 gui 应用程序时的默认设置,但您可以使用 file->new file or project... 并选择 Qt->Qt Designer 创建新的主窗口表单类)。

要向其中添加选项,您只需单击标有“在此处输入”的区域并写下您的选项文本。当您这样做时,一个操作将出现在 Qt Designer 下部的列表中。右键单击该操作并选择“转到插槽”。它将弹出一个对话框,其中已经为您选择了“triggered()”。只需单击“确定”,Qt Creator 就会处理所有细节并将您传送到插槽函数的主体。

【讨论】:

感谢您的回答。关键是我在visual studio下编程,我只使用Qt Designer而不是Qt creator,每次编译都是在VS下完成的,所以我不能右键单击并转到代码。我将编辑问题以使其更准确。

以上是关于Qt Designer 中的自定义菜单操作的主要内容,如果未能解决你的问题,请参考以下文章

Qt Designer 的自定义动作插件

Qt Designer 使用自定义插件崩溃

Qt创建者,将指定位置的自定义菜单插入菜单栏

如何创建自定义小部件并在 Qt Designer 中使用它?

如何在 Delphi Form Designer 中为自定义组件添加上下文菜单操作?

长按网页视图的水平菜​​单充气机