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 中使用它?