4

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

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

4

1 回答 1

4

这里有两个来自我的应用程序的例子。在主程序中,我将 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 文件中获取对话框。

于 2012-05-03T22:29:18.767 回答