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

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

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

简单菜单

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

  1. ' ZetCode Mono Visual Basic Qt tutorial
  2. '
  3. ' This program shows a simple
  4. ' menu. It has one action, which
  5. ' will terminate the program, when
  6. ' selected.
  7. '
  8. ' author jan bodnar
  9. ' last modified May 2009
  10. ' website www.zetcode.com
  11. Imports Qyoto
  12. Public Class VBQApp
  13. Inherits QMainWindow
  14. Public Sub New()
  15. Me.SetWindowTitle("Simple menu")
  16. Me.InitUI()
  17. Me.Resize(250, 200)
  18. Me.Move(300, 300)
  19. Me.Show()
  20. End Sub
  21. Private Sub InitUI()
  22. Dim quit As New QAction("&Quit", Me)
  23. Dim file As QMenu = Me.MenuBar().AddMenu("&File")
  24. file.AddAction(quit)
  25. Connect(quit, SIGNAL("triggered()"), qApp, SLOT("quit()"))
  26. End Sub
  27. Public Shared Sub Main(ByVal args() As String)
  28. Dim qapp As New QApplication(args)
  29. Dim app as New VBQApp
  30. QApplication.Exec()
  31. End Sub
  32. End Class

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

  1. Dim quit As New QAction("&Quit", Me)

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

  1. Dim file As QMenu = Me.MenuBar().AddMenu("&File")
  2. file.AddAction(quit)

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

  1. Connect(quit, SIGNAL("triggered()"), qApp, SLOT("quit()"))

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

Qyoto 中的菜单和工具栏 - 图1

图:简单菜单

创建一个子菜单

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

  1. ' ZetCode Mono Visual Basic Qt tutorial
  2. '
  3. ' This program creates
  4. ' a submenu
  5. '
  6. ' author jan bodnar
  7. ' last modified May 2009
  8. ' website www.zetcode.com
  9. Imports Qyoto
  10. Public Class VBQApp
  11. Inherits QMainWindow
  12. Public Sub New()
  13. Me.SetWindowTitle("Submenu")
  14. Me.InitUI()
  15. Me.Resize(280, 200)
  16. Me.Move(300, 300)
  17. Me.Show()
  18. End Sub
  19. Private Sub InitUI()
  20. Dim quit As New QAction("&Quit", Me)
  21. Dim file As QMenu = MenuBar().AddMenu("&File")
  22. Dim impm As New QMenu("Import")
  23. Dim seeds As New QAction("Import news feed...", Me)
  24. Dim marks As New QAction("Import bookmarks...", Me)
  25. Dim mail As New QAction("Import mail...", Me)
  26. impm.AddAction(seeds)
  27. impm.AddAction(marks)
  28. impm.AddAction(mail)
  29. file.AddMenu(impm)
  30. file.AddAction(quit)
  31. Connect(quit, SIGNAL("triggered()"), qApp, SLOT("quit()"))
  32. End Sub
  33. Public Shared Sub Main(ByVal args() As String)
  34. Dim qapp As New QApplication(args)
  35. Dim app As New VBQApp
  36. QApplication.Exec()
  37. End Sub
  38. End Class

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

  1. Dim file As QMenu = MenuBar().AddMenu("&File")
  2. Dim impm As New QMenu("Import")

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

  1. Dim seeds As New QAction("Import news feed...", Me)
  2. Dim marks As New QAction("Import bookmarks...", Me)
  3. Dim mail As New QAction("Import mail...", Me)

我们创建三个动作对象。

  1. impm.AddAction(seeds)
  2. impm.AddAction(marks)
  3. impm.AddAction(mail)

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

  1. file.AddMenu(impm)

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

Qyoto 中的菜单和工具栏 - 图2

图:子菜单

图像,菜单,分隔符

在以下示例中,我们将进一步增强以前的应用。 我们将在菜单中添加图标,使用快捷方式和分隔符。

  1. ' ZetCode Mono Visual Basic Qt tutorial
  2. '
  3. ' This program shows image
  4. ' menu items, a shorcut and a separator
  5. '
  6. ' author jan bodnar
  7. ' last modified May 2009
  8. ' website www.zetcode.com
  9. Imports Qyoto
  10. Public Class VBQApp
  11. Inherits QMainWindow
  12. Public Sub New()
  13. Me.SetWindowTitle("Image menu")
  14. Me.InitUI()
  15. Me.Resize(280, 200)
  16. Me.Move(300, 300)
  17. Me.Show()
  18. End Sub
  19. Private Sub InitUI()
  20. Dim newpix As New QIcon("new.png")
  21. Dim openpix As New QIcon("open.png")
  22. Dim quitpix As New QIcon("quit.png")
  23. Dim newa As New QAction(newpix, "&New", Me)
  24. Dim open As New QAction(openpix, "&Open", Me)
  25. Dim quit As New QAction(quitpix, "&Quit", Me)
  26. quit.Shortcut = New QKeySequence("Ctrl+Q")
  27. Dim file As QMenu = MenuBar().AddMenu("&File")
  28. file.AddAction(newa)
  29. file.AddAction(open)
  30. file.AddSeparator()
  31. file.AddAction(quit)
  32. Connect(quit, SIGNAL("triggered()"), qApp, SLOT("quit()"))
  33. End Sub
  34. Public Shared Sub Main(ByVal args() As String)
  35. Dim qapp As New QApplication(args)
  36. Dim app As New VBQApp
  37. QApplication.Exec()
  38. End Sub
  39. End Class

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

  1. Dim newpix As New QIcon("new.png")
  2. Dim openpix As New QIcon("open.png")
  3. Dim quitpix As New QIcon("quit.png")

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

  1. Dim newa As New QAction(newpix, "&New", Me)
  2. Dim open As New QAction(openpix, "&Open", Me)
  3. Dim quit As New QAction(quitpix, "&Quit", Me)

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

  1. quit.Shortcut = New QKeySequence("Ctrl+Q")

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

  1. file.AddSeparator()

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

Qyoto 中的菜单和工具栏 - 图3

图:图像 s, shortcut and a separator

工具栏

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

  1. ' ZetCode Mono Visual Basic Qt tutorial
  2. '
  3. ' This program creates a
  4. ' toolbar
  5. '
  6. ' author jan bodnar
  7. ' last modified May 2009
  8. ' website www.zetcode.com
  9. Imports Qyoto
  10. Public Class VBQApp
  11. Inherits QMainWindow
  12. Public Sub New()
  13. Me.SetWindowTitle("Toolbar")
  14. Me.InitUI()
  15. Me.Resize(280, 200)
  16. Me.Move(300, 300)
  17. Me.Show()
  18. End Sub
  19. Private Sub InitUI()
  20. Dim newpi As New QIcon("new.png")
  21. Dim openpi As New QIcon("open.png")
  22. Dim quitpi As New QIcon("quit.png")
  23. Dim toolbar As QToolBar = AddToolBar("main toolbar")
  24. toolbar.AddAction(newpi, "New File")
  25. toolbar.AddAction(openpi, "Open File")
  26. toolbar.AddSeparator()
  27. Dim quit As QAction = toolbar.AddAction(quitpi, _
  28. "Quit Application")
  29. Connect(quit, SIGNAL("triggered()"), qApp, SLOT("quit()"))
  30. End Sub
  31. Public Shared Sub Main(ByVal args() As String)
  32. Dim qapp As New QApplication(args)
  33. Dim app as New VBQApp
  34. QApplication.Exec()
  35. End Sub
  36. End Class

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

  1. Dim newpi As New QIcon("new.png")
  2. Dim openpi As New QIcon("open.png")
  3. Dim quitpi As New QIcon("quit.png")

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

  1. Dim toolbar As QToolBar = AddToolBar("main toolbar")

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

  1. toolbar.AddSeparator()

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

  1. Connect(quit, SIGNAL("triggered()"), qApp, SLOT("quit()"))

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

Qyoto 中的菜单和工具栏 - 图4

图:工具栏

撤销重做

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

  1. ' ZetCode Mono Visual Basic Qt tutorial
  2. '
  3. ' This program disables/enables
  4. ' toolbuttons on a toolbar
  5. '
  6. ' author jan bodnar
  7. ' last modified May 2009
  8. ' website www.zetcode.com
  9. Imports Qyoto
  10. Public Class VBQApp
  11. Inherits QMainWindow
  12. Dim clicks As Integer = 0
  13. Dim undoButton As QToolButton
  14. Dim redoButton As QToolButton
  15. Public Sub New()
  16. Me.SetWindowTitle("Undo redo")
  17. Me.InitUI()
  18. Me.Resize(280, 200)
  19. Me.Move(300, 300)
  20. Me.Show()
  21. End Sub
  22. Private Sub InitUI()
  23. Dim undoi As New QIcon("undo.png")
  24. Dim redoi As New QIcon("redo.png")
  25. Dim quitpi As New QIcon("quit.png")
  26. Dim toolbar As New QToolBar
  27. undoButton = New QToolButton
  28. redoButton = New QToolButton
  29. Dim undoAction As New QAction(undoi, "Undo", undoButton)
  30. Dim redoAction As New QAction(redoi, "Redo", redoButton)
  31. undoButton.SetDefaultAction(undoAction)
  32. redoButton.SetDefaultAction(redoAction)
  33. toolbar.AddSeparator()
  34. toolbar.AddWidget(undoButton)
  35. toolbar.AddWidget(redoButton)
  36. Dim quit As QAction = toolbar.AddAction(quitpi, "Quit Application")
  37. Connect(quit, SIGNAL("triggered()"), qApp, SLOT("quit()"))
  38. Connect(undoButton, SIGNAL("triggered(QAction*)"), _
  39. Me, SLOT("Count(QAction*)"))
  40. Connect(redoButton, SIGNAL("triggered(QAction*)"), _
  41. Me, SLOT("Count(QAction*)"))
  42. AddToolBar(toolbar)
  43. End Sub
  44. <Q_SLOT()> _
  45. Private Sub Count(ByVal action As QAction)
  46. If "Undo".Equals(action.Text)
  47. clicks -= 1
  48. Else
  49. clicks += 1
  50. End If
  51. If clicks <= 0
  52. undoButton.SetDisabled(True)
  53. redoButton.SetDisabled(False)
  54. End If
  55. If clicks >= 5
  56. undoButton.SetDisabled(False)
  57. redoButton.SetDisabled(True)
  58. End If
  59. End Sub
  60. Public Shared Sub Main(ByVal args() As String)
  61. Dim qapp As New QApplication(args)
  62. Dim app As New VBQApp
  63. QApplication.Exec()
  64. End Sub
  65. End Class

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

  1. Dim clicks As Integer = 0

clicks变量确定哪个按钮被激活或停用。

  1. Connect(undoButton, SIGNAL("triggered(QAction*)"), _
  2. Me, SLOT("Count(QAction*)"))
  3. Connect(redoButton, SIGNAL("triggered(QAction*)"), _
  4. Me, SLOT("Count(QAction*)"))

单击工具栏按钮,将发射triggered()信号。 我们将此信号连接到Count()方法。 它接收触发它的QAction对象。

  1. If "Undo".Equals(action.Text)
  2. clicks -= 1
  3. Else
  4. clicks += 1
  5. End If

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

  1. If clicks <= 0
  2. undoButton.SetDisabled(True)
  3. redoButton.SetDisabled(False)
  4. End If

SetDisabled()方法激活或停用工具栏按钮。

Qyoto 中的菜单和工具栏 - 图5

图:撤销和重做

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