{% raw %}

Qyoto 中的小部件

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

在 Visual Basic Qyoto 编程教程的这一部分中,我们将介绍 Qyoto 小部件。

小部件是 GUI 应用的基本构建块。 多年来,几个小部件已成为所有 OS 平台上所有工具包中的标准。 例如,按钮,复选框或滚动条。 Qyoto 有一组丰富的小部件,可以满足大多数编程需求。 可以将更多专门的窗口小部件创建为自定义窗口小部件。

QCheckBox

QCheckBox是具有两种状态的窗口小部件:开和关。 开状态通过复选标记显示。 它用来表示一些布尔属性。 QCheckBox小部件提供一个带有文本标签的复选框。

  1. ' ZetCode Mono Visual Basic Qt tutorial
  2. ' This program toggles the title of the
  3. ' window with the QCheckBox widget
  4. '
  5. ' author jan bodnar
  6. ' last modified April 2009
  7. ' website www.zetcode.com
  8. Imports Qyoto
  9. Public Class VBQApp
  10. Inherits QWidget
  11. Public Sub New()
  12. Me.SetWindowTitle("QCheckBox")
  13. Me.InitUI()
  14. Me.Resize(250, 200)
  15. Me.Move(300, 300)
  16. Me.Show()
  17. End Sub
  18. Private Sub InitUI()
  19. Dim cb As New QCheckBox("Show title", Me)
  20. cb.Move(50, 50)
  21. cb.SetCheckState(True)
  22. Connect(cb, SIGNAL("clicked(bool)"), Me, SLOT("OnToggle(bool)"))
  23. End Sub
  24. <Q_SLOT()> _
  25. Private Sub OnToggle(ByVal state As Boolean)
  26. If state
  27. Me.SetWindowTitle("QCheckBox")
  28. Else
  29. Me.SetWindowTitle("")
  30. End If
  31. End Sub
  32. Public Shared Sub Main(ByVal args() As String)
  33. Dim qapp As New QApplication(args)
  34. Dim app As New VBQApp
  35. QApplication.Exec()
  36. End Sub
  37. End Class

在我们的示例中,我们在窗口上放置了一个复选框。 复选框显示/隐藏窗口的标题。

  1. Me.SetWindowTitle("QCheckBox")

在构建窗口期间,我们为窗口设置标题。

  1. Dim cb As New QCheckBox("Show title", Me)

QCheckBox小部件已创建。 构造器的第一个参数是其文本标签。 第二个参数是父窗口小部件。

  1. cb.SetCheckState(True)

标题在应用的开始处可见。 因此,也必须选中该复选框。 我们使用SetCheckState()方法来选中该复选框。

  1. Connect(cb, SIGNAL("clicked(bool)"), Me, SLOT("OnToggle(bool)"))

当我们单击复选框时,将发出clicked(bool)信号。 发出信号时,我们触发OnToggle()方法。

  1. <Q_SLOT()> _
  2. Private Sub OnToggle(ByVal state As Boolean)
  3. ...
  4. End Sub

方法定义之前带有Q_SLOT()属性。 此属性通知编译器有关自定义槽的信息。

  1. If state
  2. Me.SetWindowTitle("QCheckBox")
  3. Else
  4. Me.SetWindowTitle("")
  5. End If

根据复选框的状态,我们显示或隐藏窗口的标题。

300.md - 图1

图:QCheckBox

QLabel

QLabel小部件用于显示文本或图像。 没有用户交互。

  1. ' ZetCode Mono Visual Basic Qt tutorial
  2. '
  3. ' This program shows lyrics on the
  4. ' window
  5. '
  6. ' author jan bodnar
  7. ' last modified April 2009
  8. ' website www.zetcode.com
  9. Imports Qyoto
  10. Public Class VBQApp
  11. Inherits QWidget
  12. Public Sub New()
  13. Me.SetWindowTitle("You know I'm no Good")
  14. Me.InitUI()
  15. Me.Resize(250, 200)
  16. Me.Move(300, 300)
  17. Me.Show()
  18. End Sub
  19. Private Sub InitUI()
  20. Dim text As String
  21. text = "Meet you downstairs in the bar and heard" + vbNewLine + _
  22. "your rolled up sleeves and your skull t-shirt" + vbNewLine + _
  23. "You say why did you do it with him today?" + vbNewLine + _
  24. "and sniff me out like I was Tanqueray" + vbNewLine + _
  25. "" + vbNewLine + _
  26. "cause you're my fella, my guy" + vbNewLine + _
  27. "hand me your stella and fly" + vbNewLine + _
  28. "by the time I'm out the door" + vbNewLine + _
  29. "you tear men down like Roger Moore" + vbNewLine + _
  30. "" + vbNewLine + _
  31. "I cheated myself" + vbNewLine + _
  32. "like I knew I would" + vbNewLine + _
  33. "I told ya, I was trouble" + vbNewLine + _
  34. "you know that I'm no good"
  35. Dim label As New QLabel(text, Me)
  36. label.Font = New QFont("Purisa", 9)
  37. Dim vbox As New QVBoxLayout()
  38. vbox.AddWidget(label)
  39. SetLayout(vbox)
  40. End Sub
  41. Public Shared Sub Main(ByVal args() As String)
  42. Dim qapp As New QApplication(args)
  43. Dim app As New VBQApp
  44. QApplication.Exec()
  45. End Sub
  46. End Class

我们的示例在窗口中显示了歌曲的歌词。

  1. Dim text As String
  2. text = "Meet you downstairs in the bar and heard" + vbNewLine + _
  3. "your rolled up sleeves and your skull t-shirt" + vbNewLine + _
  4. ...

我们定义了多行文字。 与 C# ,Python 或 Ruby 不同,没有简单的结构可以用 Visual Basic 语言创建多行文本。 若要在 Visual Basic 中创建多行文本,我们使用vbNewLine打印常量,+连接字符和_行终止字符。

  1. Dim label As New QLabel(text, Me)
  2. label.Font = New QFont("Purisa", 9)

我们创建标签小部件并更改其字体。

  1. Dim vbox As New QVBoxLayout()
  2. vbox.AddWidget(label)
  3. SetLayout(vbox)

代替手动编码标签的位置和大小,我们将标签放入盒子布局中。

300.md - 图2

图:QLabel

QLineEdit

QLineEdit是一个小部件,允许输入和编辑单行纯文本。 QLineEdit小部件具有撤消/重做,剪切/粘贴和拖放功能。

  1. ' ZetCode Mono Visual Basic Qt tutorial
  2. '
  3. ' This program demonstrates the
  4. ' QLineEdit widget. Text entered in the QLineEdit
  5. ' widget is shown in a QLabel widget.
  6. '
  7. ' author jan bodnar
  8. ' last modified April 2009
  9. ' website www.zetcode.com
  10. Imports Qyoto
  11. Public Class VBQApp
  12. Inherits QWidget
  13. Dim label As QLabel
  14. Public Sub New()
  15. Me.InitUI()
  16. Me.SetWindowTitle("QLineEdit")
  17. Me.Resize(250, 200)
  18. Me.Move(300, 300)
  19. Me.Show()
  20. End Sub
  21. Private Sub InitUI()
  22. label = New QLabel(Me)
  23. Dim edit As New QLineEdit(Me)
  24. Connect(edit, SIGNAL("textChanged(QString)"), Me, _
  25. SLOT("OnChanged(QString)"))
  26. edit.Move(60, 100)
  27. label.Move(60, 40)
  28. End Sub
  29. <Q_SLOT()> _
  30. Private Sub OnChanged(ByVal text As String)
  31. label.SetText(text)
  32. label.AdjustSize()
  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

在我们的示例中,我们显示了两个小部件。 行编辑和标签小部件。 输入到行编辑中的文本显示在标签窗口小部件中。

  1. Dim edit As New QLineEdit(Me)

QLineEdit小部件已创建。

  1. Connect(edit, SIGNAL("textChanged(QString)"), Me, _
  2. SLOT("OnChanged(QString)"))

当我们在行编辑中键入或删除某些文本时,将触发OnChanged()方法。 该方法采用字符串参数。

  1. <Q_SLOT()> _
  2. Private Sub OnChanged(ByVal text As String)
  3. label.SetText(text)
  4. label.AdjustSize()
  5. End Sub

OnChanged()方法中,我们将行编辑的内容设置为标签窗口小部件。 AdjustSize()方法确保所有文本都是可见的。

300.md - 图3

图:QLineEdit小部件

ToggleButton

切换按钮是设置了可检查标志的按钮。 切换按钮是具有两种状态的按钮。 已按下但未按下。 通过单击可以在这两种状态之间切换。 在某些情况下此功能非常合适。

  1. ' ZetCode Mono Visual Basic Qt tutorial
  2. '
  3. ' This program uses toggle buttons to
  4. ' change the background color of
  5. ' a widget
  6. '
  7. ' author jan bodnar
  8. ' last modified April 2009
  9. ' website www.zetcode.com
  10. Imports Qyoto
  11. Public Class VBQApp
  12. Inherits QWidget
  13. Dim square As QWidget
  14. Dim color As QColor
  15. Dim redb As QPushButton
  16. Dim greenb As QPushButton
  17. Dim blueb As QPushButton
  18. Public Sub New()
  19. Me.InitUI()
  20. Me.SetWindowTitle("Toggle buttons")
  21. Me.Resize(350, 240)
  22. Me.Move(300, 300)
  23. Me.Show()
  24. End Sub
  25. Private Sub InitUI()
  26. color = New QColor()
  27. redb = New QPushButton("Red", Me)
  28. redb.Checkable = True
  29. greenb = New QPushButton("Green", Me)
  30. greenb.Checkable = True
  31. blueb = New QPushButton("Blue", Me)
  32. blueb.Checkable = True
  33. Connect(redb, SIGNAL("toggled(bool)"), Me, SLOT("OnToggled()"))
  34. Connect(greenb, SIGNAL("toggled(bool)"), Me, SLOT("OnToggled()"))
  35. Connect(blueb, SIGNAL("toggled(bool)"), Me, SLOT("OnToggled()"))
  36. square = New QWidget(Me)
  37. square.SetStyleSheet("QWidget { background-color: black }")
  38. redb.Move(30, 30)
  39. greenb.Move(30, 80)
  40. blueb.Move(30, 130)
  41. square.SetGeometry(150, 25, 150, 150)
  42. End Sub
  43. <Q_SLOT()> _
  44. Private Sub OnToggled()
  45. Dim red As Integer = color.Red()
  46. Dim green As Integer = color.Green()
  47. Dim blue As Integer = color.Blue()
  48. If redb.Checked
  49. red = 255
  50. Else
  51. red = 0
  52. End If
  53. If greenb.Checked
  54. green = 255
  55. Else
  56. green = 0
  57. End If
  58. If blueb.Checked
  59. blue = 255
  60. Else
  61. blue = 0
  62. End If
  63. color = New QColor(red, green, blue)
  64. Dim sheet As String = String.Format("QWidget {{ background-color: {0} }}", _
  65. color.Name())
  66. square.SetStyleSheet(sheet)
  67. End Sub
  68. Public Shared Sub Main(ByVal args() As String)
  69. Dim qapp As New QApplication(args)
  70. Dim app As New VBQApp
  71. QApplication.Exec()
  72. End Sub
  73. End Class

在代码示例中,我们使用三个切换按钮来更改矩形小部件的颜色。

  1. Dim square As QWidget
  2. Dim color As QColor
  3. Dim redb As QPushButton
  4. Dim greenb As QPushButton
  5. Dim blueb As QPushButton

我们定义了五个对象。 正方形小部件是QWidget,它显示颜色。 color变量用于保存颜色值。 这三个按钮是切换按钮,用于混合颜色值。

  1. redb = New QPushButton("Red", Me)
  2. redb.Checkable = True

我们创建一个QPushButton小部件。 Checkable属性将按钮更改为切换按钮。

  1. Connect(redb, SIGNAL("toggled(bool)"), Me, SLOT("OnToggled()"))
  2. Connect(greenb, SIGNAL("toggled(bool)"), Me, SLOT("OnToggled()"))
  3. Connect(blueb, SIGNAL("toggled(bool)"), Me, SLOT("OnToggled()"))

所有三个按钮都插入到一个方法调用中,即OnToggled()方法。

  1. square = New QWidget(Me)
  2. square.SetStyleSheet("QWidget { background-color: black }")

我们创建方形小部件。 一开始是黑色的。 在 Qyoto 中,我们使用样式表来自定义小部件的外观。

OnToggled()方法内部,我们确定颜色值并将正方形小部件更新为新颜色。

  1. Dim red As Integer = color.Red()
  2. Dim green As Integer = color.Green()
  3. Dim blue As Integer = color.Blue()

在这里,我们确定方形小部件的当前颜色。

  1. If redb.Checked
  2. red = 255
  3. Else
  4. red = 0
  5. End If

根据红色切换按钮的状态,更改颜色的红色部分。

  1. color = New QColor(red, green, blue)

我们创建一个新的颜色值。

  1. Dim sheet As String = String.Format("QWidget {{ background-color: {0} }}", _
  2. color.Name())

我们使用 Visual Basic 格式对象创建适当的样式表。

  1. square.SetStyleSheet(sheet)

正方形的颜色已更新。

300.md - 图4

图:开关按钮

QComboBox

QComboBox是一个小部件,允许用户从选项列表中进行选择。 这是一个显示当前项目的选择小部件,可以弹出可选择项目的列表。 组合框可能是可编辑的。 它以占用最少屏幕空间的方式向用户显示选项列表。

  1. ' ZetCode Mono Visual Basic Qt tutorial
  2. '
  3. ' In this program, we use the QComboBox
  4. ' widget to select an option.
  5. ' The selected option is shown in the
  6. ' QLabel widget
  7. '
  8. ' author jan bodnar
  9. ' last modified April 2009
  10. ' website www.zetcode.com
  11. Imports Qyoto
  12. Public Class VBQApp
  13. Inherits QWidget
  14. Dim label As QLabel
  15. Public Sub New()
  16. Me.SetWindowTitle("QComboBox")
  17. Me.InitUI()
  18. Me.Resize(250, 200)
  19. Me.Move(300, 300)
  20. Me.Show()
  21. End Sub
  22. Private Sub InitUI()
  23. label = New QLabel("Ubuntu", Me)
  24. Dim combo As New QComboBox(Me)
  25. combo.AddItem("Ubuntu")
  26. combo.AddItem("Mandriva")
  27. combo.AddItem("Fedora")
  28. combo.AddItem("Red Hat")
  29. combo.AddItem("Gentoo")
  30. combo.Move(50, 30)
  31. label.Move(50, 100)
  32. Connect(combo, SIGNAL("activated(QString)"), _
  33. Me, SLOT("OnActivated(QString)"))
  34. End Sub
  35. <Q_SLOT()> _
  36. Private Sub OnActivated(ByVal text As String)
  37. label.SetText(text)
  38. label.AdjustSize()
  39. End Sub
  40. Public Shared Sub Main(ByVal args() As String)
  41. Dim qapp As New QApplication(args)
  42. Dim app As New VBQApp
  43. QApplication.Exec()
  44. End Sub
  45. End Class

在我们的代码示例中,我们有两个小部件。 组合框和标签小部件。 从组合框中选择的选项显示在标签中。

  1. label = New QLabel("Ubuntu", Me)

这是一个标签,它将显示组合框中当前选择的选项。

  1. Dim combo As New QComboBox(Me)

我们创建QComboBox小部件的实例。

  1. combo.AddItem("Ubuntu")
  2. combo.AddItem("Mandriva")
  3. combo.AddItem("Fedora")
  4. combo.AddItem("Red Hat")
  5. combo.AddItem("Gentoo")

组合框将填充值。

  1. Connect(combo, SIGNAL("activated(QString)"), _
  2. Me, SLOT("OnActivated(QString)"))

当我们从组合框中选择一个选项时,将触发OnActivated()方法。

  1. <Q_SLOT()> _
  2. Private Sub OnActivated(ByVal text As String)
  3. label.SetText(text)
  4. label.AdjustSize()
  5. End Sub

OnActivated()方法中,我们将标签小部件更新为从组合框中选择的当前字符串。

300.md - 图5

图:QComboBox小部件

在 Visual Basic Qyoto 教程的这一部分中,我们介绍了几个 Qyoto 小部件。

{% endraw %}