是否可以在gtk2hs中使用Glade创建的菜单?

时间:2012-05-02 20:48:56

标签: haskell glade gtk2hs

我在gtk2hs应用程序中使用Glade创建了菜单。是否可以在我的Haskell代码中使用它来为每个激活的菜单项编写动作?在Hackage上有一个简单的例子或项目可用作说明性示例吗?

我能够找到http://www.muitovar.com/gtk2hs/chap7-1.html的唯一菜单示例似乎无助于使用Gtk Builder XML。

1 个答案:

答案 0 :(得分:4)

这里有两个来自我的应用的例子。在main中,我将GTK小部件绑定到变量,并将其绑定到我在其他模块中实现的回调函数。

- 加载Glade文件:

gui <- builderNew
builderAddFromFile gui "myGUI.glade"

- 关闭应用程序:

- 将窗口“mainWindow”(在Glade文件中定义)绑定到变量

mainWindow <- builderGetObject gui castToWindow "mainWindow"

- 将菜单项“menu_Quit”(在Glade文件中定义)绑定到变量

mQuit <- builderGetObject gui castToMenuItem "menu_Quit"

- 将菜单项绑定到GTK函数“widgetDestroy”

on mQuit menuItemActivate $ widgetDestroy mainWindow

- 将mainWindow的事件“objectDestroy”绑定到GTK函数“mainQuit”

on mainWindow objectDestroy mainQuit

- 要在用户选择其他菜单项时调用一个函数,请说“menu_About”:

- 将菜单项绑定到变量

mAbout <- builderGetObject gui castToMenuItem "menu_About"

- 使菜单项显示关于对话框(在Glade文件中定义)

on mAbout menuItemActivate $ do
    aboutDialog <- builderGetObject gui castToDialog "aboutDialog"
    set aboutDialog [ widgetVisible := True ]
    dialogRun aboutDialog
    set aboutDialog [ widgetVisible := False ]

您可以将do块放在一个函数中,也可以放在一个模块中,您可以在其中定义对GTK事件的所有响应:

showAboutDialog :: Builder -> IO ()
showAboutDialog gui = [insert do block here]

然后你可以用menuItemActivate替换do块:

on mAbout menuItemActivate $ showAboutDialog gui

请注意,我将Builder对象传递给showAboutDialog,因为该函数需要从Glade文件中获取对话框。