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

在 Ruby Qt 编程教程的这一部分中,我们将使用对话框。

对话框窗口或对话框是大多数现代 GUI 应用必不可少的部分。 对话被定义为两个或更多人之间的对话。 在计算机应用中,对话框是一个窗口,用于与应用“对话”。 对话框用于输入数据,修改数据,更改应用设置等。对话框是用户与计算机程序之间进行通信的重要手段。

MessageDialog

消息框是方便的对话框,可向应用的用户提供消息。 该消息由文本和图像数据组成。

  1. #!/usr/bin/ruby
  2. # ZetCode Ruby Qt tutorial
  3. #
  4. # This program demonstrates
  5. # MessageBox dialogs
  6. #
  7. # author: jan bodnar
  8. # website: www.zetcode.com
  9. # last modified: July 2009
  10. require 'Qt'
  11. class QtApp < Qt::Widget
  12. slots 'showDialog()'
  13. def initialize
  14. super
  15. setWindowTitle "Message dialogs"
  16. init_ui
  17. resize 250, 150
  18. move 300, 300
  19. show
  20. end
  21. def init_ui
  22. grid = Qt::GridLayout.new self
  23. grid.setSpacing 2
  24. error = Qt::PushButton.new "Error", self
  25. warning = Qt::PushButton.new "Warning", self
  26. question = Qt::PushButton.new "Question", self
  27. information = Qt::PushButton.new "Information", self
  28. about = Qt::PushButton.new "About", self
  29. grid.addWidget error, 0, 0
  30. grid.addWidget warning, 0, 1
  31. grid.addWidget question, 1, 0
  32. grid.addWidget information, 1, 1
  33. grid.addWidget about, 2, 0
  34. connect(error, SIGNAL("clicked()"),
  35. self, SLOT("showDialog()"))
  36. connect(warning, SIGNAL("clicked()"),
  37. self, SLOT("showDialog()"))
  38. connect(question, SIGNAL("clicked()"),
  39. self, SLOT("showDialog()"))
  40. connect(information, SIGNAL("clicked()"),
  41. self, SLOT("showDialog()"))
  42. connect(about, SIGNAL("clicked()"),
  43. self, SLOT("showDialog()"))
  44. end
  45. def showDialog
  46. button = sender
  47. if "Error" == button.text
  48. Qt::MessageBox.critical self, "Error", "Error loading file!"
  49. elsif "Warning" == button.text
  50. Qt::MessageBox.warning self, "Warning", "Operation not permitted!"
  51. elsif "Question" == button.text
  52. Qt::MessageBox.question self, "Question", "Are you sure to quit?"
  53. elsif "Information" == button.text
  54. Qt::MessageBox.information self, "Information", "Download completed."
  55. elsif "About" == button.text
  56. Qt::MessageBox.about self, "About", "ZetCode Ruby Qt tutorial."
  57. end
  58. end
  59. end
  60. app = Qt::Application.new ARGV
  61. QtApp.new
  62. app.exec

我们使用GridLayout管理器来设置五个按钮的网格。 每个按钮显示一个不同的消息框。

  1. if "Error" == button.text
  2. Qt::MessageBox.critical self, "Error", "Error loading file!"

如果按下错误按钮,则会显示错误对话框。 我们使用MessageBox类的静态方法来显示消息框。

Ruby Qt 中的对话框 - 图1

图:信息对话框

Qt::InputDialog

Qt::InputDialog类提供了一个简单的便捷对话框,可从用户那里获取单个值。 输入值可以是字符串,数字或列表中的项目。 必须设置标签以告知用户他们应该输入什么。

  1. #!/usr/bin/ruby
  2. # ZetCode Ruby Qt tutorial
  3. #
  4. # This program shows an input
  5. # dialog
  6. #
  7. # author: jan bodnar
  8. # website: www.zetcode.com
  9. # last modified: July 2009
  10. require 'Qt'
  11. class QtApp < Qt::Widget
  12. slots 'showDialog()'
  13. def initialize
  14. super
  15. setWindowTitle "Input dialog"
  16. init_ui
  17. resize 400, 80
  18. move 300, 300
  19. show
  20. end
  21. def init_ui
  22. show = Qt::PushButton.new "Dialog", self
  23. connect(show, SIGNAL("clicked()"),
  24. self, SLOT("showDialog()"))
  25. show.move 20, 20
  26. @edit = Qt::LineEdit.new self
  27. @edit.move 130, 22
  28. end
  29. def showDialog
  30. text = Qt::InputDialog.getText self, "Input Dialog",
  31. "Enter your name"
  32. if text != nil
  33. name = text.strip
  34. if not name.empty?
  35. @edit.setText name
  36. end
  37. end
  38. end
  39. end
  40. app = Qt::Application.new ARGV
  41. QtApp.new
  42. app.exec

在代码示例中,我们有一个按钮和一行编辑。 该按钮显示一个输入对话框。 我们得到一些文本,文本显示在行编辑小部件中。

  1. text = Qt::InputDialog.getText self, "Input Dialog",
  2. "Enter your name"

getText静态方法创建输入对话框。 对话框中的文本存储在text变量中。

  1. if text != nil
  2. name = text.strip
  3. if not name.empty?
  4. @edit.setText name
  5. end
  6. end

在更新行编辑之前,请确保text变量不为null且不为空,并且不仅由空格组成。

Ruby Qt 中的对话框 - 图2

图:输入对话框

Qt::ColorDialog

Qt::ColorDialog类提供一个用于指定颜色的对话框小部件。 颜色对话框的功能是允许用户选择颜色。

  1. #!/usr/bin/ruby
  2. # ZetCode Ruby Qt tutorial
  3. #
  4. # In this program, we use the
  5. # ColorDialog to change the color
  6. # of a label text
  7. #
  8. # author: jan bodnar
  9. # website: www.zetcode.com
  10. # last modified: July 2009
  11. require 'Qt'
  12. class QtApp < Qt::Widget
  13. slots 'showDialog()'
  14. def initialize
  15. super
  16. setWindowTitle "Color dialog"
  17. init_ui
  18. resize 400, 300
  19. move 300, 300
  20. show
  21. end
  22. def init_ui
  23. @label = Qt::Label.new "ZetCode Ruby Qt tutorial", self
  24. vbox = Qt::VBoxLayout.new self
  25. @label.setAlignment Qt::AlignCenter
  26. vbox.addWidget @label
  27. end
  28. def mousePressEvent event
  29. color = Qt::ColorDialog.getColor
  30. if not color.isValid
  31. return
  32. end
  33. @label.setStyleSheet "QWidget { color: %s }" % color.name
  34. end
  35. end
  36. app = Qt::Application.new ARGV
  37. QtApp.new
  38. app.exec

我们在窗口中心显示一些文本。 通过单击窗口区域,我们显示一个颜色对话框。 我们将文本前景色更改为从对话框中选择的颜色。

  1. def mousePressEvent event
  2. ...
  3. end

为了接收我们窗口的鼠标按下事件,我们必须重新实现mousePressEvent方法。

  1. color = Qt::ColorDialog.getColor

正在创建ColorDialog。 所选颜色存储在color变量中。

  1. @label.setStyleSheet "QWidget { color: %s }" % color.name

在这里,我们更新标签文本的前景色。

Ruby Qt 中的对话框 - 图3

图:Qt::ColorDialog

Qt::FontDialog

Qt::FontDialog类提供用于选择字体的对话框小部件。

  1. #!/usr/bin/ruby
  2. # ZetCode Ruby Qt tutorial
  3. #
  4. # In this program, we use the
  5. # FontDialog to change the font
  6. # of a label text
  7. #
  8. # author: jan bodnar
  9. # website: www.zetcode.com
  10. # last modified: July 2009
  11. require 'Qt'
  12. class QtApp < Qt::Widget
  13. slots 'showDialog()'
  14. def initialize
  15. super
  16. setWindowTitle "Font dialog"
  17. init_ui
  18. resize 400, 300
  19. move 300, 300
  20. show
  21. end
  22. def init_ui
  23. @label = Qt::Label.new "ZetCode Ruby Qt tutorial", self
  24. vbox = Qt::VBoxLayout.new self
  25. @label.setAlignment Qt::AlignCenter
  26. vbox.addWidget @label
  27. end
  28. def mousePressEvent event
  29. ok = Qt::Boolean.new
  30. font = Qt::FontDialog.getFont ok
  31. if not ok
  32. return
  33. end
  34. @label.setFont font
  35. end
  36. end
  37. app = Qt::Application.new ARGV
  38. QtApp.new
  39. app.exec

此示例与上一个示例相似。 这次,我们更改文本的字体。

  1. font = Qt::FontDialog.getFont ok

正在创建Qt::FontDialog

  1. if not ok
  2. return
  3. end

如果单击对话框的“确定”按钮,则布尔值ok变量为true。 如果按下了取消按钮,我们将从方法中返回。

  1. @label.setFont font

我们将标签更新为新选择的字体。

Ruby Qt 中的对话框 - 图4

图:Qt::FontDialog

在 Ruby Qt 教程的这一部分中,我们使用了对话框窗口。