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

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

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

MessageDialog

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

  1. package com.zetcode;
  2. import com.trolltech.qt.QSignalEmitter;
  3. import com.trolltech.qt.gui.QApplication;
  4. import com.trolltech.qt.gui.QGridLayout;
  5. import com.trolltech.qt.gui.QMessageBox;
  6. import com.trolltech.qt.gui.QPushButton;
  7. import com.trolltech.qt.gui.QWidget;
  8. /**
  9. * ZetCode QtJambi tutorial
  10. *
  11. * This program demonstrates
  12. * QMessageBox dialogs
  13. *
  14. * @author jan bodnar
  15. * website zetcode.com
  16. * last modified March 2009
  17. */
  18. public class JambiApp extends QWidget {
  19. public JambiApp() {
  20. setWindowTitle("Message Dialogs");
  21. initUI();
  22. resize(220, 90);
  23. move(400, 300);
  24. show();
  25. }
  26. private void initUI() {
  27. QGridLayout grid = new QGridLayout(this);
  28. grid.setSpacing(2);
  29. QPushButton error = new QPushButton("Error", this);
  30. QPushButton warning = new QPushButton("Warning", this);
  31. QPushButton question = new QPushButton("Question", this);
  32. QPushButton information = new QPushButton("Information", this);
  33. QPushButton about = new QPushButton("About", this);
  34. grid.addWidget(error, 0, 0);
  35. grid.addWidget(warning, 0, 1);
  36. grid.addWidget(question, 1, 0);
  37. grid.addWidget(information, 1, 1);
  38. grid.addWidget(about, 2, 0);
  39. error.clicked.connect(this, "showDialog()");
  40. warning.clicked.connect(this, "showDialog()");
  41. question.clicked.connect(this, "showDialog()");
  42. information.clicked.connect(this, "showDialog()");
  43. about.clicked.connect(this, "showDialog()");
  44. }
  45. private void showDialog() {
  46. QPushButton button = (QPushButton) QSignalEmitter.signalSender();
  47. if ("Error".equals(button.text())) {
  48. QMessageBox.critical(this, "Error", "Error loading file!");
  49. } else if ("Warning".equals(button.text())) {
  50. QMessageBox.warning(this, "Warning", "Operation not permitted!");
  51. } else if ("Question".equals(button.text())) {
  52. QMessageBox.question(this, "Question", "Are you sure to quit?");
  53. } else if ("Information".equals(button.text())) {
  54. QMessageBox.information(this, "Information", "Download completed.");
  55. } else if ("About".equals(button.text())) {
  56. QMessageBox.about(this, "About", "ZetCode QtJambi tutorial.");
  57. }
  58. }
  59. public static void main(String[] args) {
  60. QApplication.initialize(args);
  61. new JambiApp();
  62. QApplication.exec();
  63. }
  64. }

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

  1. QPushButton button = (QPushButton) QSignalEmitter.signalSender();

在这里,我们确定哪个按钮称为showDialog()方法。

  1. if ("Error".equals(button.text())) {
  2. QMessageBox.critical(this, "Error", "Error loading file!");
  3. }

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

QtJambi 对话框 - 图1

QtJambi 对话框 - 图2

QtJambi 对话框 - 图3

QtJambi 对话框 - 图4

QtJambi 对话框 - 图5

QInputDialog

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

  1. package com.zetcode;
  2. import com.trolltech.qt.core.Qt;
  3. import com.trolltech.qt.gui.QApplication;
  4. import com.trolltech.qt.gui.QInputDialog;
  5. import com.trolltech.qt.gui.QLineEdit;
  6. import com.trolltech.qt.gui.QPushButton;
  7. import com.trolltech.qt.gui.QWidget;
  8. /**
  9. * ZetCode QtJambi tutorial
  10. *
  11. * This program shows an input
  12. * dialog
  13. *
  14. * @author jan bodnar
  15. * website zetcode.com
  16. * last modified March 2009
  17. */
  18. public class JambiApp extends QWidget {
  19. QLineEdit edit;
  20. public JambiApp() {
  21. setWindowTitle("Input Dialog");
  22. initUI();
  23. move(400, 300);
  24. show();
  25. }
  26. private void initUI() {
  27. setGeometry(300, 300, 350, 80);
  28. QPushButton show = new QPushButton("Dialog", this);
  29. show.clicked.connect(this, "showDialog()");
  30. show.setFocusPolicy(Qt.FocusPolicy.NoFocus);
  31. show.move(20, 20);
  32. edit = new QLineEdit(this);
  33. edit.move(130, 22);
  34. }
  35. private void showDialog() {
  36. String text = QInputDialog.getText(
  37. this, "Input Dialog", "Enter your name");
  38. if (text!=null && !text.trim().isEmpty()) {
  39. edit.setText(text);
  40. }
  41. }
  42. public static void main(String[] args) {
  43. QApplication.initialize(args);
  44. new JambiApp();
  45. QApplication.exec();
  46. }
  47. }

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

  1. String text = QInputDialog.getText(
  2. this, "Input Dialog", "Enter your name");

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

  1. if (text!=null && !text.trim().isEmpty()) {
  2. edit.setText(text);
  3. }

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

QtJambi 对话框 - 图6

图:输入对话框

QColorDialog

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

  1. package com.zetcode;
  2. import com.trolltech.qt.core.Qt;
  3. import com.trolltech.qt.gui.QApplication;
  4. import com.trolltech.qt.gui.QColor;
  5. import com.trolltech.qt.gui.QColorDialog;
  6. import com.trolltech.qt.gui.QLabel;
  7. import com.trolltech.qt.gui.QMouseEvent;
  8. import com.trolltech.qt.gui.QVBoxLayout;
  9. import com.trolltech.qt.gui.QWidget;
  10. import java.util.Formatter;
  11. /**
  12. * ZetCode QtJambi tutorial
  13. *
  14. * In this program, we use the
  15. * QColorDialog to change the color
  16. * of a label text
  17. *
  18. * @author jan bodnar
  19. * website zetcode.com
  20. * last modified March 2009
  21. */
  22. public class JambiApp extends QWidget {
  23. QLabel label;
  24. public JambiApp() {
  25. setWindowTitle("Color Dialog");
  26. initUI();
  27. resize(250, 200);
  28. move(400, 300);
  29. show();
  30. }
  31. private void initUI() {
  32. label = new QLabel("ZetCode QtJambi tutorial", this);
  33. QVBoxLayout vbox = new QVBoxLayout(this);
  34. label.setAlignment(Qt.AlignmentFlag.AlignCenter);
  35. vbox.addWidget(label);
  36. }
  37. @Override
  38. public void mousePressEvent(QMouseEvent event) {
  39. QColor color = QColorDialog.getColor();
  40. if (!color.isValid()) return;
  41. Formatter fmt = new Formatter();
  42. fmt.format("QWidget { color: %s }", color.name());
  43. label.setStyleSheet(fmt.toString());
  44. }
  45. public static void main(String[] args) {
  46. QApplication.initialize(args);
  47. new JambiApp();
  48. QApplication.exec();
  49. }
  50. }

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

  1. @Override
  2. public void mousePressEvent(QMouseEvent event) {
  3. ...
  4. }

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

  1. QColor color = QColorDialog.getColor();

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

  1. Formatter fmt = new Formatter();
  2. fmt.format("QWidget { color: %s }", color.name());
  3. label.setStyleSheet(fmt.toString());

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

QtJambi 对话框 - 图7

图:QColorDialog

QFontDialog

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

  1. package com.zetcode;
  2. import com.trolltech.qt.core.Qt;
  3. import com.trolltech.qt.gui.QApplication;
  4. import com.trolltech.qt.gui.QFontDialog;
  5. import com.trolltech.qt.gui.QLabel;
  6. import com.trolltech.qt.gui.QMouseEvent;
  7. import com.trolltech.qt.gui.QVBoxLayout;
  8. import com.trolltech.qt.gui.QWidget;
  9. /**
  10. * ZetCode QtJambi tutorial
  11. *
  12. * In this program, we use the
  13. * QFontDialog to change the font
  14. * of a label text
  15. *
  16. * @author jan bodnar
  17. * website zetcode.com
  18. * last modified March 2009
  19. */
  20. public class JambiApp extends QWidget {
  21. QLabel label;
  22. public JambiApp() {
  23. setWindowTitle("QFontColor dialog");
  24. initUI();
  25. resize(250, 200);
  26. move(300, 300);
  27. show();
  28. }
  29. private void initUI() {
  30. label = new QLabel("ZetCode QtJambi tutorial", this);
  31. QVBoxLayout vbox = new QVBoxLayout(this);
  32. label.setAlignment(Qt.AlignmentFlag.AlignCenter);
  33. vbox.addWidget(label);
  34. }
  35. @Override
  36. public void mousePressEvent(QMouseEvent event) {
  37. QFontDialog.Result result = QFontDialog.getFont();
  38. if (!result.ok) return;
  39. label.setFont(result.font);
  40. }
  41. public static void main(String[] args) {
  42. QApplication.initialize(args);
  43. new JambiApp();
  44. QApplication.exec();
  45. }
  46. }

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

  1. QFontDialog.Result result = QFontDialog.getFont();

正在创建QFontDialog。 该对话框返回QFontDialog.Result类。 此类有两个字段。 字体和确定字段。

  1. if (!result.ok) return;

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

  1. label.setFont(result.font);

font字段存储所选字体。 我们将标签的字体更新为新选择的字体。

QtJambi 对话框 - 图8

图:QFontDialog

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