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

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

GUI 应用中的常见部分是菜单栏。 菜单栏由称为菜单的对象组成。 顶层菜单在菜单栏上带有其标签。 菜单具有菜单项。 菜单项是在应用内部执行特定操作的命令。 菜单也可以具有子菜单,这些子菜单具有自己的菜单项。

简单菜单

在第一个示例中,我们将创建一个带有一个文件菜单的菜单栏。 该菜单将只有一个菜单项。 通过选择项目,应用退出。

  1. <?php
  2. /*
  3. ZetCode PHP GTK tutorial
  4. This example shows a simple menu.
  5. author: Jan Bodnar
  6. website: www.zetcode.com
  7. last modified: August 2011
  8. */
  9. class Example extends GtkWindow {
  10. public function __construct() {
  11. parent::__construct();
  12. $this->init_ui();
  13. }
  14. public function init_ui() {
  15. $this->set_title('Simple menu');
  16. $this->connect_simple('destroy', array('gtk', 'main_quit'));
  17. $this->modify_bg(Gtk::STATE_NORMAL, new GdkColor(6400, 6400, 6440));
  18. $mb = new GtkMenuBar();
  19. $filemenu = new GtkMenu();
  20. $filemi = new GtkMenuItem("File");
  21. $filemi->set_submenu($filemenu);
  22. $exitmi = new GtkMenuItem("Exit");
  23. $exitmi->connect_simple('activate', array('gtk', 'main_quit'));
  24. $filemenu->append($exitmi);
  25. $mb->append($filemi);
  26. $vbox = new GtkVBox(false, 2);
  27. $vbox->pack_start($mb, false, false, 0);
  28. $this->add($vbox);
  29. $this->set_default_size(250, 200);
  30. $this->set_position(GTK::WIN_POS_CENTER);
  31. $this->show_all();
  32. }
  33. }
  34. new Example();
  35. Gtk::main();
  36. ?>

这是一个最小的菜单栏功能示例。

  1. $mb = new GtkMenuBar();

GtkMenuBar小部件已创建。 这是各个菜单的容器。

  1. $filemenu = new GtkMenu();
  2. $filemi = new GtkMenuItem("File");
  3. $filemi->set_submenu($filemenu);

创建顶层GtkMenuItem。 菜单项代表 GUI 应用中的操作。

  1. $exitmi = new GtkMenuItem("Exit");
  2. $exitmi->connect_simple('activate', array('gtk', 'main_quit'));
  3. $filemenu->append($exitmi);

将创建出口GtkMenuItem,并将其附加到文件GtkMenuItem中。

  1. $mb->append($filemi);

顶级GtkMenuItem被附加到GtkMenuBar小部件。

  1. $vbox = new GtkVBox(false, 2);
  2. $vbox->pack_start($mb, false, false, 0);

与其他工具包不同,我们必须自己照顾菜单栏的布局管理。 我们将菜单栏放入垂直框中。

PHP GTK 中的菜单和工具栏 - 图1

图:简单菜单

子菜单

我们的最后一个示例演示了如何创建子菜单。 子菜单是另一个菜单中的菜单。

  1. <?php
  2. /*
  3. ZetCode PHP GTK tutorial
  4. This example shows a submenu.
  5. author: Jan Bodnar
  6. website: www.zetcode.com
  7. last modified: August 2011
  8. */
  9. class Example extends GtkWindow {
  10. public function __construct() {
  11. parent::__construct();
  12. $this->init_ui();
  13. }
  14. public function init_ui() {
  15. $this->set_title('Submenu');
  16. $this->connect_simple('destroy', array('gtk', 'main_quit'));
  17. $this->modify_bg(Gtk::STATE_NORMAL, new GdkColor(6400, 6400, 6440));
  18. $mb = new GtkMenuBar();
  19. $filemenu = new GtkMenu();
  20. $filemi = new GtkMenuItem("File");
  21. $filemi->set_submenu($filemenu);
  22. $mb->append($filemi);
  23. $imenu = new GtkMenu();
  24. $importm = new GtkMenuItem("Import");
  25. $importm->set_submenu($imenu);
  26. $inews = new GtkMenuItem("Import news feed...");
  27. $ibookmarks = new GtkMenuItem("Import bookmarks...");
  28. $imail = new GtkMenuItem("Import mail...");
  29. $imenu->append($inews);
  30. $imenu->append($ibookmarks);
  31. $imenu->append($imail);
  32. $filemenu->append($importm);
  33. $exitmi = new GtkMenuItem("Exit");
  34. $exitmi->connect_simple('activate', array('gtk', 'main_quit'));
  35. $filemenu->append($exitmi);
  36. $vbox = new GtkVBox(false, 2);
  37. $vbox->pack_start($mb, false, false, 0);
  38. $this->add($vbox);
  39. $this->set_default_size(320, 250);
  40. $this->set_position(GTK::WIN_POS_CENTER);
  41. $this->show_all();
  42. }
  43. }
  44. new Example();
  45. Gtk::main();
  46. ?>

子菜单创建。

  1. $imenu = new GtkMenu();

子菜单是常规GtkMenu

  1. $importm = new GtkMenuItem("Import");
  2. $importm->set_submenu($imenu);

它是菜单项的子菜单,它会登录到顶级文件菜单。

  1. $inews = new GtkMenuItem("Import news feed...");
  2. $ibookmarks = new GtkMenuItem("Import bookmarks...");
  3. $imail = new GtkMenuItem("Import mail...");
  4. $imenu->append($inews);
  5. $imenu->append($ibookmarks);
  6. $imenu->append($imail);

子菜单有其自己的菜单项。

PHP GTK 中的菜单和工具栏 - 图2

图:子菜单

图像菜单

在下一个示例中,我们将进一步探索菜单。 我们将图像和加速器添加到我们的菜单项中。 加速器是用于激活菜单项的键盘快捷键。

  1. <?php
  2. /*
  3. ZetCode PHP GTK tutorial
  4. This example shows a menu with
  5. images, accelerators and a separator.
  6. author: Jan Bodnar
  7. website: www.zetcode.com
  8. last modified: August 2011
  9. */
  10. class Example extends GtkWindow {
  11. public function __construct() {
  12. parent::__construct();
  13. $this->init_ui();
  14. }
  15. public function init_ui() {
  16. $this->set_title('Image menu');
  17. $this->connect_simple('destroy', array('gtk', 'main_quit'));
  18. $this->modify_bg(Gtk::STATE_NORMAL, new GdkColor(6400, 6400, 6440));
  19. $mb = new GtkMenuBar();
  20. $filemenu = new GtkMenu();
  21. $filemi = new GtkMenuItem("File");
  22. $filemi->set_submenu($filemenu);
  23. $mb->append($filemi);
  24. $agr = new GtkAccelGroup();
  25. $this->add_accel_group($agr);
  26. $newi = new GtkImageMenuItem(Gtk::STOCK_NEW, $agr);
  27. $newi->add_accelerator('activate', $agr, Gdk::KEY_N,
  28. Gdk::CONTROL_MASK, Gtk::ACCEL_VISIBLE);
  29. $newi->connect_simple('activate', array($this, 'on_new_selected'));
  30. $filemenu->append($newi);
  31. $openmi = new GtkImageMenuItem(Gtk::STOCK_OPEN, $agr);
  32. $openmi->add_accelerator('activate', $agr, Gdk::KEY_O,
  33. Gdk::CONTROL_MASK, Gtk::ACCEL_VISIBLE);
  34. $filemenu->append($openmi);
  35. $sep = new GtkSeparatorMenuItem();
  36. $filemenu->append($sep);
  37. $exitmi = new GtkImageMenuItem(Gtk::STOCK_QUIT, $agr);
  38. $exitmi->add_accelerator('activate', $agr, Gdk::KEY_Q,
  39. Gdk::CONTROL_MASK, Gtk::ACCEL_VISIBLE);
  40. $exitmi->connect_simple('activate', array('gtk', 'main_quit'));
  41. $filemenu->append($exitmi);
  42. $vbox = new GtkVBox(false, 2);
  43. $vbox->pack_start($mb, false, false, 0);
  44. $this->add($vbox);
  45. $this->set_default_size(320, 250);
  46. $this->set_position(GTK::WIN_POS_CENTER);
  47. $this->show_all();
  48. }
  49. public function on_new_selected() {
  50. print "new";
  51. }
  52. }
  53. new Example();
  54. Gtk::main();
  55. ?>

我们的示例显示了具有三个子菜单项的顶级菜单项。 每个菜单项都有一个图像和一个加速器。 退出菜单项的加速器退出应用。 新菜单项的加速器将"new"打印到控制台。

  1. $agr = new GtkAccelGroup();
  2. $this->add_accel_group($agr);

要使用加速器,我们创建一个全局GtkAccelGroup对象。 稍后将使用。

  1. $newi = new GtkImageMenuItem(Gtk::STOCK_NEW, $agr);
  2. $newi->add_accelerator('activate', $agr, Gdk::KEY_N,
  3. Gdk::CONTROL_MASK, Gtk::ACCEL_VISIBLE);
  4. $newi->connect_simple('activate', array($this, 'on_new_selected'));
  5. $filemenu->append($newi);

创建了GtkImageMenuItem。 图片来自图片库。 我们还创建了 Ctrl + N 加速器。 当我们用鼠标选择菜单项或按下加速器时,一条消息会打印到控制台上。

  1. $sep = new GtkSeparatorMenuItem();
  2. $filemenu->append($sep);

这些行创建一个分隔符。 它用于将菜单项放入逻辑组。

PHP GTK 中的菜单和工具栏 - 图3

图:图像 menu

菜单将我们可以在应用中使用的命令分组。 使用工具栏可以快速访问最常用的命令。

简单的工具栏

接下来,我们创建一个简单的工具栏。 工具栏提供对应用最常用功能的快速访问。

  1. <?php
  2. /*
  3. ZetCode PHP GTK tutorial
  4. This example shows a toolbar widget.
  5. author: Jan Bodnar
  6. website: www.zetcode.com
  7. last modified: August 2011
  8. */
  9. class Example extends GtkWindow {
  10. public function __construct() {
  11. parent::__construct();
  12. $this->init_ui();
  13. }
  14. public function init_ui() {
  15. $this->set_title('Toolbar');
  16. $this->connect_simple('destroy', array('gtk', 'main_quit'));
  17. $toolbar = new GtkToolbar();
  18. $toolbar->set_toolbar_style(Gtk::TOOLBAR_ICONS);
  19. $newtb = GtkToolButton::new_from_stock(Gtk::STOCK_NEW);
  20. $opentb = GtkToolButton::new_from_stock(Gtk::STOCK_OPEN);
  21. $savetb = GtkToolButton::new_from_stock(Gtk::STOCK_SAVE);
  22. $sep = new GtkSeparatorToolItem();
  23. $quittb = GtkToolButton::new_from_stock(Gtk::STOCK_QUIT);
  24. $toolbar->insert($newtb, 0);
  25. $toolbar->insert($opentb, 1);
  26. $toolbar->insert($savetb, 2);
  27. $toolbar->insert($sep, 3);
  28. $toolbar->insert($quittb, 4);
  29. $quittb->connect_simple("clicked", array('Gtk', 'main_quit'));
  30. $vbox = new GtkVBox(false, 2);
  31. $vbox->pack_start($toolbar, false, false, 0);
  32. $this->add($vbox);
  33. $this->set_default_size(250, 200);
  34. $this->set_position(GTK::WIN_POS_CENTER);
  35. $this->show_all();
  36. }
  37. }
  38. new Example();
  39. Gtk::main();
  40. ?>

该示例显示了一个工具栏和四个工具按钮。

  1. $toolbar = new GtkToolbar();

GtkToolbar小部件已创建。

  1. $toolbar->set_toolbar_style(Gtk::TOOLBAR_ICONS);

在工具栏上,我们仅显示图标。 没有文字。

  1. $newtb = GtkToolButton::new_from_stock(Gtk::STOCK_NEW);

创建带有库存图像的GtkToolButton。 该图像来自图像的内置库存。

  1. $sep = new GtkSeparatorToolItem();

这是一个分隔符。 它可用于将工具栏按钮放入逻辑组。

  1. $toolbar->insert($newtb, 0);
  2. $toolbar->insert($opentb, 1);
  3. ...

工具栏按钮插入到工具栏小部件中。 insert()方法的第一个参数是工具按钮。 第二个是工具栏上的位置。

PHP GTK 中的菜单和工具栏 - 图4

图:工具栏

在 PHP GTK 教程的这一章中,我们展示了如何使用菜单和工具栏。