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

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

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

QCheckBox

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

  1. package com.zetcode;
  2. import com.trolltech.qt.core.Qt.FocusPolicy;
  3. import com.trolltech.qt.gui.QApplication;
  4. import com.trolltech.qt.gui.QCheckBox;
  5. import com.trolltech.qt.gui.QWidget;
  6. /**
  7. * ZetCode QtJambi tutorial
  8. *
  9. * This program uses QCheckBox
  10. * widget to show/hide the title
  11. * of the window
  12. *
  13. * @author jan bodnar
  14. * website zetcode.com
  15. * last modified March 2009
  16. */
  17. public class JambiApp extends QWidget {
  18. public JambiApp() {
  19. setWindowTitle("QCheckBox");
  20. initUI();
  21. resize(250, 150);
  22. move(300, 300);
  23. show();
  24. }
  25. public void initUI() {
  26. QCheckBox cb = new QCheckBox("Show Title", this);
  27. cb.setFocusPolicy(FocusPolicy.NoFocus);
  28. cb.setChecked(true);
  29. cb.toggled.connect(this, "onChanged(boolean)");
  30. cb.move(50, 50);
  31. }
  32. public void onChanged(boolean state) {
  33. if (state) {
  34. setWindowTitle("QCheckBox");
  35. } else {
  36. setWindowTitle("");
  37. }
  38. }
  39. public static void main(String[] args) {
  40. QApplication.initialize(args);
  41. new JambiApp();
  42. QApplication.exec();
  43. }
  44. }

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

  1. setWindowTitle("QCheckBox");

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

  1. QCheckBox cb = new QCheckBox("Show Title", this);

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

  1. cb.setFocusPolicy(FocusPolicy.NoFocus);

我不喜欢聚焦复选框的视觉表示。 此行禁用焦点。

  1. cb.setChecked(true);

标题在应用的开始处可见。 因此,也必须选中该复选框。

  1. cb.toggled.connect(this, "onChanged(boolean)");

复选框的状态更改时,会发出toggled()信号。 发出信号时,我们触发onChanged()方法。

  1. if (state) {
  2. setWindowTitle("QCheckBox");
  3. } else {
  4. setWindowTitle("");
  5. }

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

QtJambi 中的小部件 - 图1

图:QCheckBox

QLabel

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

  1. package com.zetcode;
  2. import com.trolltech.qt.gui.QApplication;
  3. import com.trolltech.qt.gui.QFont;
  4. import com.trolltech.qt.gui.QLabel;
  5. import com.trolltech.qt.gui.QVBoxLayout;
  6. import com.trolltech.qt.gui.QWidget;
  7. /**
  8. * ZetCode QtJambi tutorial
  9. *
  10. * This program uses QLabel to
  11. * show lyrics of a song
  12. *
  13. * @author jan bodnar
  14. * website zetcode.com
  15. * last modified March 2009
  16. */
  17. public class JambiApp extends QWidget {
  18. public JambiApp() {
  19. setWindowTitle("You know I'm no Good");
  20. initUI();
  21. move(300, 300);
  22. show();
  23. }
  24. private void initUI() {
  25. String text =
  26. "Meet you downstairs in the bar and heard\n" +
  27. "your rolled up sleeves and your skull t-shirt\n" +
  28. "You say why did you do it with him today?\n" +
  29. "and sniff me out like I was Tanqueray\n\n" +
  30. "cause you're my fella, my guy\n" +
  31. "hand me your stella and fly\n" +
  32. "by the time I'm out the door\n" +
  33. "you tear men down like Roger Moore\n\n" +
  34. "I cheated myself\n" +
  35. "like I knew I would\n" +
  36. "I told ya, I was trouble\n" +
  37. "you know that I'm no good";
  38. QLabel label = new QLabel(text, this);
  39. label.setFont(new QFont("Purisa", 9));
  40. QVBoxLayout vbox = new QVBoxLayout();
  41. vbox.addWidget(label);
  42. setLayout(vbox);
  43. }
  44. public static void main(String[] args) {
  45. QApplication.initialize(args);
  46. new JambiApp();
  47. QApplication.exec();
  48. }
  49. }

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

  1. String text =
  2. "Meet you downstairs in the bar and heard\n" +
  3. ...

我们定义了多行文字。

  1. QLabel label = new QLabel(text, this);
  2. label.setFont(new QFont("Purisa", 9));

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

  1. QVBoxLayout vbox = new QVBoxLayout();
  2. vbox.addWidget(label);
  3. setLayout(vbox);

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

QtJambi 中的小部件 - 图2

图:QLabel

QLineEdit

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

  1. package com.zetcode;
  2. import com.trolltech.qt.gui.QApplication;
  3. import com.trolltech.qt.gui.QLabel;
  4. import com.trolltech.qt.gui.QLineEdit;
  5. import com.trolltech.qt.gui.QWidget;
  6. /**
  7. * ZetCode QtJambi tutorial
  8. *
  9. * This program shows text
  10. * which is entered in a QLineEdit
  11. * widget in a QLabel widget
  12. *
  13. * @author jan bodnar
  14. * website zetcode.com
  15. * last modified March 2009
  16. */
  17. public class JambiApp extends QWidget {
  18. QLabel label;
  19. public JambiApp() {
  20. setWindowTitle("QLineEdit");
  21. initUI();
  22. resize(250, 200);
  23. move(300, 300);
  24. show();
  25. }
  26. private void initUI() {
  27. label = new QLabel(this);
  28. QLineEdit edit = new QLineEdit(this);
  29. edit.textChanged.connect(this, "onChanged(String)");
  30. edit.move(60, 100);
  31. label.move(60, 40);
  32. }
  33. private void onChanged(String text) {
  34. label.setText(text);
  35. label.adjustSize();
  36. }
  37. public static void main(String[] args) {
  38. QApplication.initialize(args);
  39. new JambiApp();
  40. QApplication.exec();
  41. }
  42. }

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

  1. QLineEdit edit = new QLineEdit(this);

QLineEdit小部件已创建。

  1. edit.textChanged.connect(this, "onChanged(String)");

当我们在行编辑中键入或删除某些文本时,将触发onChanged()方法。

  1. private void onChanged(String text) {
  2. label.setText(text);
  3. label.adjustSize();
  4. }

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

QtJambi 中的小部件 - 图3

图:QLineEdit小部件

ToggleButton

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

  1. package com.zetcode;
  2. import com.trolltech.qt.gui.QApplication;
  3. import com.trolltech.qt.gui.QColor;
  4. import com.trolltech.qt.gui.QPushButton;
  5. import com.trolltech.qt.gui.QWidget;
  6. import java.util.Formatter;
  7. /**
  8. * ZetCode QtJambi tutorial
  9. *
  10. * This program uses toggle buttons to
  11. * change the background color of
  12. * a widget
  13. *
  14. * @author jan bodnar
  15. * website zetcode.com
  16. * last modified March 2009
  17. */
  18. public class JambiApp extends QWidget {
  19. private QWidget square;
  20. private QColor color;
  21. private QPushButton redb;
  22. private QPushButton greenb;
  23. private QPushButton blueb;
  24. public JambiApp() {
  25. setWindowTitle("Toggle Buttons");
  26. initUI();
  27. resize(350, 240);
  28. move(300, 300);
  29. show();
  30. }
  31. private void initUI() {
  32. color = new QColor();
  33. redb = new QPushButton("Red", this);
  34. redb.setCheckable(true);
  35. greenb = new QPushButton("Green", this);
  36. greenb.setCheckable(true);
  37. blueb = new QPushButton("Blue", this);
  38. blueb.setCheckable(true);
  39. redb.toggled.connect(this, "onToggled()");
  40. greenb.toggled.connect(this, "onToggled()");
  41. blueb.toggled.connect(this, "onToggled()");
  42. square = new QWidget(this);
  43. square.setStyleSheet("QWidget { background-color: black }");
  44. redb.move(30, 30);
  45. greenb.move(30, 80);
  46. blueb.move(30, 130);
  47. square.setGeometry(150, 25, 150, 150);
  48. }
  49. public void onToggled() {
  50. int red = color.red();
  51. int green = color.green();
  52. int blue = color.blue();
  53. if (redb.isChecked()) {
  54. red = 255;
  55. } else {
  56. red = 0;
  57. }
  58. if (greenb.isChecked()) {
  59. green = 255;
  60. } else {
  61. green = 0;
  62. }
  63. if (blueb.isChecked()) {
  64. blue = 255;
  65. } else {
  66. blue = 0;
  67. }
  68. color = new QColor(red, green, blue);
  69. Formatter fmt = new Formatter();
  70. fmt.format("QWidget { background-color: %s }", color.name());
  71. square.setStyleSheet(fmt.toString());
  72. }
  73. public static void main(String[] args) {
  74. QApplication.initialize(args);
  75. new JambiApp();
  76. QApplication.exec();
  77. }
  78. }

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

  1. private QWidget square;
  2. private QColor color;
  3. private QPushButton redb;
  4. private QPushButton greenb;
  5. private QPushButton blueb;

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

  1. redb = new QPushButton("Red", this);
  2. redb.setCheckable(true);

我们创建一个QPushButton小部件。 setCheckable()方法将按钮更改为切换按钮。

  1. redb.toggled.connect(this, "onToggled()");
  2. greenb.toggled.connect(this, "onToggled()");
  3. blueb.toggled.connect(this, "onToggled()");

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

  1. square = new QWidget(this);
  2. square.setStyleSheet("QWidget { background-color: black }");

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

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

  1. int red = color.red();
  2. int green = color.green();
  3. int blue = color.blue();

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

  1. if (redb.isChecked()) {
  2. red = 255;
  3. } else {
  4. red = 0;
  5. }

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

  1. color = new QColor(red, green, blue);

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

  1. Formatter fmt = new Formatter();
  2. fmt.format("QWidget { background-color: %s }", color.name());

这两行创建样式表的文本。 我们使用 Java Formatter对象。

  1. square.setStyleSheet(fmt.toString());

正方形的颜色已更新。

QtJambi 中的小部件 - 图4

图:开关按钮

QComboBox

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

  1. package com.zetcode;
  2. import com.trolltech.qt.gui.QApplication;
  3. import com.trolltech.qt.gui.QComboBox;
  4. import com.trolltech.qt.gui.QLabel;
  5. import com.trolltech.qt.gui.QWidget;
  6. /**
  7. * ZetCode QtJambi tutorial
  8. *
  9. * This program uses the QComboBox widget.
  10. * The option selected from the combo box is
  11. * displayed in the label widget.
  12. *
  13. * @author jan bodnar
  14. * website zetcode.com
  15. * last modified March 2009
  16. */
  17. public class JambiApp extends QWidget {
  18. QLabel label;
  19. public JambiApp() {
  20. setWindowTitle("QComboBox");
  21. initUI();
  22. resize(250, 200);
  23. move(300, 300);
  24. show();
  25. }
  26. private void initUI() {
  27. label = new QLabel("Ubuntu", this);
  28. QComboBox combo = new QComboBox(this);
  29. combo.addItem("Ubuntu");
  30. combo.addItem("Fedora");
  31. combo.addItem("Mandriva");
  32. combo.addItem("Red Hat");
  33. combo.addItem("Mint");
  34. combo.currentStringChanged.connect(this, "OnActivated(String)");
  35. combo.move(50, 30);
  36. label.move(50, 100);
  37. }
  38. private void OnActivated(String text) {
  39. label.setText(text);
  40. label.adjustSize();
  41. }
  42. public static void main(String[] args) {
  43. QApplication.initialize(args);
  44. new JambiApp();
  45. QApplication.exec();
  46. }
  47. }

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

  1. label = new QLabel("Ubuntu", this);

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

  1. QComboBox combo = new QComboBox(this);

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

  1. combo.addItem("Ubuntu");
  2. combo.addItem("Fedora");
  3. combo.addItem("Mandriva");
  4. combo.addItem("Red Hat");
  5. combo.addItem("Mint");

组合框将填充值。

  1. combo.currentStringChanged.connect(this, "OnActivated(String)");

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

  1. private void OnActivated(String text) {
  2. label.setText(text);
  3. label.adjustSize();
  4. }

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

QtJambi 中的小部件 - 图5

图:QComboBox小部件

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