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

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

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

简单菜单

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

  1. package com.zetcode;
  2. import com.trolltech.qt.gui.QAction;
  3. import com.trolltech.qt.gui.QApplication;
  4. import com.trolltech.qt.gui.QMainWindow;
  5. import com.trolltech.qt.gui.QMenu;
  6. /**
  7. * ZetCode QtJambi tutorial
  8. *
  9. * This program shows a simple
  10. * menu. It has one action, which
  11. * will terminate the program, when
  12. * selected.
  13. *
  14. * @author jan bodnar
  15. * website zetcode.com
  16. * last modified March 2009
  17. */
  18. public class JambiApp extends QMainWindow {
  19. public JambiApp() {
  20. setWindowTitle("Simple menu");
  21. initUI();
  22. resize(250, 200);
  23. move(300, 300);
  24. show();
  25. }
  26. private void initUI() {
  27. QAction quit = new QAction("&Quit", this);
  28. QMenu file = menuBar().addMenu("&File");
  29. file.addAction(quit);
  30. quit.triggered.connect(QApplication.instance(), "quit()");
  31. }
  32. public static void main(String[] args) {
  33. QApplication.initialize(args);
  34. new JambiApp();
  35. QApplication.exec();
  36. }
  37. }

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

  1. QAction quit = new QAction("&Quit", this);

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

  1. QMenu file = menuBar().addMenu("&File");
  2. file.addAction(quit);

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

  1. quit.triggered.connect(QApplication.instance(), "quit()");

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

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

图:简单菜单

创建一个子菜单

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

  1. package com.zetcode;
  2. import com.trolltech.qt.gui.QAction;
  3. import com.trolltech.qt.gui.QApplication;
  4. import com.trolltech.qt.gui.QMainWindow;
  5. import com.trolltech.qt.gui.QMenu;
  6. /**
  7. * ZetCode QtJambi tutorial
  8. *
  9. * This program creates a
  10. * submenu
  11. *
  12. * @author jan bodnar
  13. * website zetcode.com
  14. * last modified March 2009
  15. */
  16. public class JambiApp extends QMainWindow {
  17. public JambiApp() {
  18. setWindowTitle("Submenu");
  19. initUI();
  20. resize(250, 200);
  21. move(300, 300);
  22. show();
  23. }
  24. private void initUI() {
  25. QAction quit = new QAction("&Quit", this);
  26. QMenu file = menuBar().addMenu("&File");
  27. QMenu impm = new QMenu("Import");
  28. QAction seeds = new QAction("Import news feed...", this);
  29. QAction marks = new QAction("Import bookmarks...", this);
  30. QAction mail = new QAction("Import mail...", this);
  31. impm.addAction(seeds);
  32. impm.addAction(marks);
  33. impm.addAction(mail);
  34. file.addMenu(impm);
  35. file.addAction(quit);
  36. quit.triggered.connect(QApplication.instance(), "quit()");
  37. }
  38. public static void main(String[] args) {
  39. QApplication.initialize(args);
  40. new JambiApp();
  41. QApplication.exec();
  42. }
  43. }

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

  1. QMenu file = menuBar().addMenu("&File");
  2. QMenu impm = new QMenu("Import");

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

  1. QAction seeds = new QAction("Import news feed...", this);
  2. QAction marks = new QAction("Import bookmarks...", this);
  3. QAction mail = new QAction("Import mail...", this);

我们创建三个动作对象。

  1. impm.addAction(seeds);
  2. impm.addAction(marks);
  3. impm.addAction(mail);

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

  1. file.addMenu(impm);

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

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

图:子菜单

图像,菜单,分隔符

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

  1. package com.zetcode;
  2. import com.trolltech.qt.gui.QAction;
  3. import com.trolltech.qt.gui.QApplication;
  4. import com.trolltech.qt.gui.QIcon;
  5. import com.trolltech.qt.gui.QMainWindow;
  6. import com.trolltech.qt.gui.QMenu;
  7. /**
  8. * ZetCode QtJambi tutorial
  9. *
  10. * This program shows image
  11. * menus, shortcuts and a separator
  12. *
  13. * @author jan bodnar
  14. * website zetcode.com
  15. * last modified March 2009
  16. */
  17. public class JambiApp extends QMainWindow {
  18. public JambiApp() {
  19. setWindowTitle("Image menu");
  20. initUI();
  21. resize(250, 200);
  22. move(300, 300);
  23. show();
  24. }
  25. private void initUI() {
  26. QIcon newpix = new QIcon("new.png");
  27. QIcon openpix = new QIcon("open.png");
  28. QIcon quitpix = new QIcon("quit.png");
  29. QAction newa = new QAction(newpix, "&New", this);
  30. QAction open = new QAction(openpix, "&Open", this);
  31. QAction quit = new QAction(quitpix, "&Quit", this);
  32. quit.setShortcut("Ctrl+Q");
  33. QMenu file;
  34. file = menuBar().addMenu("&File");
  35. file.addAction(newa);
  36. file.addAction(open);
  37. file.addSeparator();
  38. file.addAction(quit);
  39. quit.triggered.connect(QApplication.instance(), "quit()");
  40. }
  41. public static void main(String[] args) {
  42. QApplication.initialize(args);
  43. new JambiApp();
  44. QApplication.exec();
  45. }
  46. }

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

  1. QIcon newpix = new QIcon("new.png");
  2. QIcon openpix = new QIcon("open.png");
  3. QIcon quitpix = new QIcon("quit.png");

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

  1. QAction newa = new QAction(newpix, "&New", this);
  2. QAction open = new QAction(openpix, "&Open", this);
  3. QAction quit = new QAction(quitpix, "&Quit", this);

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

  1. quit.setShortcut("Ctrl+Q");

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

  1. file.addSeparator();

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

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

图:图像 s, shortcut and a separator

工具栏

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

  1. package com.zetcode;
  2. import com.trolltech.qt.gui.QAction;
  3. import com.trolltech.qt.gui.QApplication;
  4. import com.trolltech.qt.gui.QIcon;
  5. import com.trolltech.qt.gui.QMainWindow;
  6. import com.trolltech.qt.gui.QToolBar;
  7. /**
  8. * ZetCode QtJambi tutorial
  9. *
  10. * This program creates a
  11. * toolbar
  12. *
  13. * @author jan bodnar
  14. * website zetcode.com
  15. * last modified April 2009
  16. */
  17. public class JambiApp extends QMainWindow {
  18. public JambiApp() {
  19. setWindowTitle("Toolbar");
  20. initUI();
  21. resize(250, 200);
  22. move(300, 300);
  23. show();
  24. }
  25. private void initUI() {
  26. QIcon newpi = new QIcon("new.png");
  27. QIcon openpi = new QIcon("open.png");
  28. QIcon quitpi = new QIcon("quit.png");
  29. QToolBar toolbar = addToolBar("main toolbar");
  30. toolbar.addAction(newpi, "New File");
  31. toolbar.addAction(openpi, "Open File");
  32. toolbar.addSeparator();
  33. QAction quit = toolbar.addAction(quitpi,
  34. "Quit Application");
  35. quit.triggered.connect(QApplication.instance(), "quit()");
  36. }
  37. public static void main(String[] args) {
  38. QApplication.initialize(args);
  39. new JambiApp();
  40. QApplication.exec();
  41. }
  42. }

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

  1. QIcon newpi = new QIcon("new.png");
  2. QIcon openpi = new QIcon("open.png");
  3. QIcon quitpi = new QIcon("quit.png");

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

  1. QToolBar toolbar = addToolBar("main toolbar");

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

  1. toolbar.addSeparator();

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

  1. quit.triggered.connect(QApplication.instance(), "quit()");

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

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

图:工具栏

撤销重做

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

  1. package com.zetcode;
  2. import com.trolltech.qt.QSignalEmitter;
  3. import com.trolltech.qt.gui.QAction;
  4. import com.trolltech.qt.gui.QApplication;
  5. import com.trolltech.qt.gui.QIcon;
  6. import com.trolltech.qt.gui.QMainWindow;
  7. import com.trolltech.qt.gui.QToolBar;
  8. /**
  9. * ZetCode QtJambi tutorial
  10. *
  11. * This program disables/enables
  12. * actions on a toolbar
  13. *
  14. * @author jan bodnar
  15. * website zetcode.com
  16. * last modified March 2009
  17. */
  18. public class JambiApp extends QMainWindow {
  19. private int count = 0;
  20. private QAction undo;
  21. private QAction redo;
  22. public JambiApp() {
  23. setWindowTitle("Undo redo");
  24. initUI();
  25. resize(300, 200);
  26. move(400, 300);
  27. show();
  28. }
  29. private void initUI() {
  30. QIcon undoi = new QIcon("undo.png");
  31. QIcon redoi = new QIcon("redo.png");
  32. QIcon quitpi = new QIcon("quit.png");
  33. QToolBar toolbar = addToolBar("first toolbar");
  34. undo = toolbar.addAction(undoi, "Undo");
  35. redo = toolbar.addAction(redoi, "Redo");
  36. undo.triggered.connect(this, "count()");
  37. redo.triggered.connect(this, "count()");
  38. toolbar.addSeparator();
  39. QAction quit = toolbar.addAction(quitpi, "Quit Application");
  40. quit.triggered.connect(QApplication.instance(), "quit()");
  41. }
  42. private void count() {
  43. QAction action = (QAction) QSignalEmitter.signalSender();
  44. if ("Undo".equals(action.text())) {
  45. count += -1;
  46. } else {
  47. count += 1;
  48. }
  49. if (count <= 0) {
  50. undo.setDisabled(true);
  51. redo.setDisabled(false);
  52. }
  53. if (count >= 5) {
  54. undo.setDisabled(false);
  55. redo.setDisabled(true);
  56. }
  57. }
  58. public static void main(String[] args) {
  59. QApplication.initialize(args);
  60. new JambiApp();
  61. QApplication.exec();
  62. }
  63. }

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

  1. private int count = 0;

计数变量确定哪个按钮被激活和停用。

  1. undo.triggered.connect(this, "count()");
  2. redo.triggered.connect(this, "count()");

单击工具栏按钮,将发射triggered信号。 我们将此信号连接到count()方法。

  1. QAction action = (QAction) QSignalEmitter.signalSender();

工具栏上的两个按钮都调用count()方法。 我们需要在它们之间说出来。 这条线确定哪个动作对象实际发出信号。

  1. if ("Undo".equals(action.text())) {
  2. count += -1;
  3. } else {
  4. count += 1;
  5. }

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

  1. if (count <= 0) {
  2. undo.setDisabled(true);
  3. redo.setDisabled(false);
  4. }

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

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

图:撤销和重做

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