原文: http://zetcode.com/gui/rubyqt/menustoolbars/

在 Ruby Qt 编程教程的这一部分中,我们将使用菜单和工具栏。

菜单栏是 GUI 应用中最可见的部分之一。 它是位于各个菜单中的一组命令。 在控制台应用中,您必须记住所有这些神秘命令,在这里,我们将大多数命令分组为逻辑部分。 有公认的标准可以进一步减少学习新应用的时间。 菜单将我们可以在应用中使用的命令分组。 使用工具栏可以快速访问最常用的命令。

简单菜单

第一个示例将显示一个简单的菜单。

  1. #!/usr/bin/ruby
  2. # ZetCode Ruby Qt tutorial
  3. #
  4. # This program shows a simple
  5. # menu. It has one action, which
  6. # will terminate the program, when
  7. # selected.
  8. #
  9. # author: Jan Bodnar
  10. # website: www.zetcode.com
  11. # last modified: November 2012
  12. require 'Qt'
  13. class QtApp < Qt::MainWindow
  14. def initialize
  15. super
  16. setWindowTitle "Simple menu"
  17. init_ui
  18. resize 250, 150
  19. move 300, 300
  20. show
  21. end
  22. def init_ui
  23. quit = Qt::Action.new "&Quit", self
  24. file = menuBar().addMenu "&File"
  25. file.addAction quit
  26. connect(quit, SIGNAL("triggered()"),
  27. Qt::Application.instance, SLOT("quit()"))
  28. end
  29. end
  30. app = Qt::Application.new ARGV
  31. QtApp.new
  32. app.exec

我们有一个菜单栏,一个菜单和一个动作。 为了使用菜单,我们必须继承MainWindow小部件。

  1. quit = Qt::Action.new "&Quit", self

此代码行创建一个Action。 每个Menu具有一个或多个动作对象。 注意 AND 字符(&)。 它为以下项目创建快捷方式: Alt + Q 。 它还强调了Q字符。 下拉菜单中的文件时,该快捷方式处于活动状态。

  1. file = menuBar().addMenu "&File"
  2. file.addAction quit

我们创建一个Menu对象。 &字符创建快捷方式: Alt + F 。 连续的快捷键 Alt + FAlt + Q 退出了应用。

  1. connect(quit, SIGNAL("triggered()"),
  2. Qt::Application.instance, SLOT("quit()"))

当我们从菜单中选择此选项时,应用退出。

菜单和工具栏 - 图1

图:简单菜单

子菜单

子菜单是插入另一个菜单对象的菜单。 下一个示例对此进行了演示。

  1. #!/usr/bin/ruby
  2. # ZetCode Ruby Qt tutorial
  3. #
  4. # This program creates a
  5. # submenu
  6. #
  7. # author: Jan Bodnar
  8. # website: www.zetcode.com
  9. # last modified: November 2012
  10. require 'Qt'
  11. class QtApp < Qt::MainWindow
  12. def initialize
  13. super
  14. setWindowTitle "Submenu"
  15. init_ui
  16. resize 280, 200
  17. move 300, 300
  18. show
  19. end
  20. def init_ui
  21. quit = Qt::Action.new "&Quit", self
  22. file = menuBar().addMenu "&File"
  23. impm = Qt::Menu.new "Import"
  24. seeds = Qt::Action.new "Import news feed...", self
  25. marks = Qt::Action.new "Import bookmarks...", self
  26. mail = Qt::Action.new "Import mail...", self
  27. impm.addAction seeds
  28. impm.addAction marks
  29. impm.addAction mail
  30. file.addMenu impm
  31. file.addAction quit
  32. connect(quit, SIGNAL("triggered()"),
  33. Qt::Application.instance, SLOT("quit()"))
  34. end
  35. end
  36. app = Qt::Application.new ARGV
  37. QtApp.new
  38. app.exec

在示例中,文件菜单的子菜单中有三个选项。

  1. file = menuBar().addMenu "&File"
  2. impm = Qt::Menu.new "Import"

我们有两个Menu对象。 文件菜单和导入菜单。

  1. seeds = Qt::Action.new "Import news feed...", self
  2. marks = Qt::Action.new "Import bookmarks...", self
  3. mail = Qt::Action.new "Import mail...", self

我们创建三个动作对象。

  1. impm.addAction seeds
  2. impm.addAction marks
  3. impm.addAction mail

我们将动作对象添加到导入菜单中。

  1. file.addMenu impm

最后,我们将导入菜单添加到文件菜单中。

菜单和工具栏 - 图2

图:子菜单

图像,菜单,分隔符

在以下示例中,我们将进一步增强以前的应用。 我们将在菜单中添加图标,使用快捷方式和分隔符。 请注意,默认情况下,可能会将 Gnome 桌面配置为不显示菜单图标。 在这种情况下,我们需要在 Gnome 接口配置中启用menu_have_icons选项。

  1. gconftool-2 --type Boolean --set /desktop/gnome/interface/menus_have_icons True

我们可以使用上面的命令或gconf-editor工具。

  1. #!/usr/bin/ruby
  2. # ZetCode Ruby Qt tutorial
  3. #
  4. # This program shows image
  5. # menus, shortcuts and a separator
  6. #
  7. # author: Jan Bodnar
  8. # website: www.zetcode.com
  9. # last modified: November 2012
  10. require 'Qt'
  11. class QtApp < Qt::MainWindow
  12. def initialize
  13. super
  14. setWindowTitle "Image menu"
  15. init_ui
  16. resize 280, 200
  17. move 300, 300
  18. show
  19. end
  20. def init_ui
  21. newpix = Qt::Icon.new "new.png"
  22. openpix = Qt::Icon.new "open.png"
  23. quitpix = Qt::Icon.new "exit.png"
  24. newa = Qt::Action.new newpix, "&New", self
  25. open = Qt::Action.new openpix, "&Open", self
  26. quit = Qt::Action.new quitpix, "&Quit", self
  27. quit.setShortcut "Ctrl+Q"
  28. file = menuBar().addMenu "&File"
  29. file.addAction newa
  30. file.addAction open
  31. file.addSeparator
  32. file.addAction quit
  33. connect(quit, SIGNAL("triggered()"),
  34. Qt::Application.instance, SLOT("quit()"))
  35. end
  36. end
  37. app = Qt::Application.new ARGV
  38. QtApp.new
  39. app.exec

在我们的示例中,我们有一个包含三个动作的菜单。 如果我们选择退出操作,则实际上只有退出操作才可以执行某些操作。 我们还创建了分隔符和 Ctrl + Q 快捷方式,它们将终止应用。

  1. newpix = Qt::Icon.new "new.png"
  2. openpix = Qt::Icon.new "open.png"
  3. quitpix = Qt::Icon.new "exit.png"

这些是我们将在应用中使用的 PNG 图像。

  1. newa = Qt::Action.new newpix, "&New", self
  2. open = Qt::Action.new openpix, "&Open", self
  3. quit = Qt::Action.new quitpix, "&Quit", self

在这里,我们创建三个动作对象。 第一个参数是Icon

  1. quit.setShortcut "Ctrl+Q"

这行创建一个快捷方式。 通过按下此快捷方式,我们将运行退出操作,这将退出应用。

  1. file.addSeparator

我们创建一个分隔符。 分隔符是一条水平线,它使我们能够将菜单操作分组为一些逻辑部分。

菜单和工具栏 - 图3

图:图像 s, shortcut and a separator

工具栏

ToolBar类提供了一个可移动面板,其中包含一组控件,这些控件提供对应用操作的快速访问。

  1. #!/usr/bin/ruby
  2. # ZetCode Ruby Qt tutorial
  3. #
  4. # This program creates a
  5. # toolbar
  6. #
  7. # author: Jan Bodnar
  8. # website: www.zetcode.com
  9. # last modified: November 2012
  10. require 'Qt'
  11. class QtApp < Qt::MainWindow
  12. def initialize
  13. super
  14. setWindowTitle "Toolbar"
  15. init_ui
  16. resize 250, 150
  17. move 300, 300
  18. show
  19. end
  20. def init_ui
  21. newpi = Qt::Icon.new "new2.png"
  22. openpi = Qt::Icon.new "open2.png"
  23. quitpi = Qt::Icon.new "exit2.png"
  24. toolbar = addToolBar "main toolbar"
  25. toolbar.addAction newpi, "New File"
  26. toolbar.addAction openpi, "Open File"
  27. toolbar.addSeparator
  28. quit = toolbar.addAction quitpi, "Quit Application"
  29. connect(quit, SIGNAL("triggered()"),
  30. Qt::Application.instance, SLOT("quit()"))
  31. end
  32. end
  33. app = Qt::Application.new ARGV
  34. QtApp.new
  35. app.exec

我们创建一个带有三个动作对象和一个分隔符的工具栏。

  1. newpi = Qt::Icon.new "new2.png"
  2. openpi = Qt::Icon.new "open2.png"
  3. quitpi = Qt::Icon.new "exit2.png"

工具栏动作对象将显示这些图标。

  1. toolbar = addToolBar "main toolbar"

MainWindowaddToolBar方法为应用创建一个工具栏。 文本字符串为工具栏命名。 此名称用于引用此工具栏,因为一个应用中可以有多个工具栏。 如果右键单击窗口区域,我们将看到一个可检查的选项,该选项显示或隐藏工具栏。

  1. toolbar.addSeparator

我们创建一个垂直分隔符。

  1. connect(quit, SIGNAL("triggered()"),
  2. Qt::Application.instance, SLOT("quit()"))

当我们单击退出操作对象时,应用终止。

菜单和工具栏 - 图4

图:工具栏

撤销重做

以下示例演示了如何停用工具栏上的工具栏按钮。 这是 GUI 编程中的常见做法。 例如,保存按钮。 如果我们将文档的所有更改都保存到磁盘上,则在大多数文本编辑器中,“保存”按钮将被停用。 这样,应用会向用户指示所有更改都已保存。

  1. #!/usr/bin/ruby
  2. # ZetCode Ruby Qt tutorial
  3. #
  4. # This program disables/enables
  5. # actions on a toolbar
  6. #
  7. # author: Jan Bodnar
  8. # website: www.zetcode.com
  9. # last modified: November 2012
  10. require 'Qt'
  11. class QtApp < Qt::MainWindow
  12. slots 'count()'
  13. def initialize
  14. super
  15. setWindowTitle "Toolbar"
  16. init_ui
  17. resize 250, 150
  18. move 300, 300
  19. show
  20. end
  21. def init_ui
  22. @count = 2
  23. undoi = Qt::Icon.new "undo.png"
  24. redoi = Qt::Icon.new "redo.png"
  25. quitpi = Qt::Icon.new "quit.png"
  26. toolbar = addToolBar "first toolbar"
  27. @und = toolbar.addAction undoi, "Undo"
  28. @red = toolbar.addAction redoi, "Redo"
  29. connect @und, SIGNAL("triggered()"), self, SLOT("count()")
  30. connect @red, SIGNAL("triggered()"), self, SLOT("count()")
  31. toolbar.addSeparator
  32. quit = toolbar.addAction quitpi, "Quit Application"
  33. connect quit, SIGNAL("triggered()"),
  34. Qt::Application.instance, SLOT("quit()")
  35. end
  36. def count
  37. action = sender
  38. if "Undo" == action.text
  39. @count = @count - 1
  40. else
  41. @count = @count + 1
  42. end
  43. if @count <= 0
  44. @und.setDisabled true
  45. @red.setDisabled false
  46. end
  47. if @count >= 5
  48. @und.setDisabled false
  49. @red.setDisabled true
  50. end
  51. end
  52. end
  53. app = Qt::Application.new ARGV
  54. QtApp.new
  55. app.exec

在我们的示例中,我们有三个Action对象和一个分隔符。 在撤消或重做按钮上单击几下后,它们将被停用。 外观上,按钮显示为灰色。

  1. @count = 2

@count变量确定哪个按钮被激活和禁用。

  1. connect @und, SIGNAL("triggered()"), self, SLOT("count()")
  2. connect @red, SIGNAL("triggered()"), self, SLOT("count()")

单击工具栏按钮,将发射triggered信号。 我们将此信号连接到count方法。

  1. action = sender

工具栏上的两个按钮都调用count方法。 我们需要在它们之间说出来。 这条线确定哪个动作对象实际发出信号。

  1. if "Undo" == action.text
  2. @count = @count - 1
  3. else
  4. @count = @count + 1
  5. end

撤消工具栏按钮从计数变量中减去 1。 重做添加 1.根据计数变量的值,我们启用或禁用工具栏按钮。

  1. if @count <= 0
  2. @und.setDisabled true
  3. @red.setDisabled false
  4. end

setDisabled方法激活或停用工具栏按钮。

菜单和工具栏 - 图5

图:撤销和重做

在 Ruby Qt 教程的这一部分中,我们提到了菜单和工具栏。