我在gtk2hs应用程序中使用Glade创建了菜单。是否可以在我的Haskell代码中使用它来为每个激活的菜单项编写动作?在Hackage上有一个简单的例子或项目可用作说明性示例吗?
我能够找到http://www.muitovar.com/gtk2hs/chap7-1.html的唯一菜单示例似乎无助于使用Gtk Builder XML。
答案 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文件中获取对话框。