具有空白 UI 和 GTK+ 2.0 的 C++ 程序

标签 c++ user-interface gtk

我使用 GTK 库(2.0 版)为 UI 编写了一个 C++ 软件。

编译(使用 makefile)没有出错,但是当我执行程序时,窗口显示为空。

我想我在创建界面的代码中犯了一些错误。 特别是我对小部件的定位和大小有一些疑问。

.h 界面文件由结构体 widgets_t 的声明(包含所有指向界面小部件的指针)和函数 build_interface 的声明(创建和初始化 UI)组成。

.cpp接口(interface)文件是

#include <gtk/gtk.h>
#include "interface.h"
void build_interface (widgets_t *widgets)
{
  //window
  widgets->W = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(widgets->W), "myNavigator");
  gtk_window_set_default_size(GTK_WINDOW(widgets->W),800,600);
  gtk_window_set_position(GTK_WINDOW(widgets->W), GTK_WIN_POS_NONE);
  //menu bar
  widgets->MB = gtk_menu_bar_new();
  widgets->IF = gtk_menu_item_new_with_mnemonic("File");
  gtk_menu_bar_append(GTK_MENU_BAR(widgets->MB), widgets->IF);
  widgets->MF = gtk_menu_new();
  gtk_menu_item_set_submenu(GTK_MENU_ITEM(widgets->IF), widgets->MF);
  widgets->IQ = gtk_menu_item_new_with_mnemonic("Close");
  gtk_menu_shell_append (GTK_MENU_SHELL (widgets->MF), widgets->IQ);
  widgets->IM = gtk_menu_item_new_with_mnemonic("Map");
  gtk_menu_bar_append(GTK_MENU_BAR(widgets->MB), widgets->IM);
  widgets->MM = gtk_menu_new();
  gtk_menu_item_set_submenu(GTK_MENU_ITEM(widgets->IM), widgets->MM);
  widgets->ILM = gtk_menu_item_new_with_mnemonic("Load");
  gtk_menu_shell_append (GTK_MENU_SHELL (widgets->MM), widgets->ILM);
  widgets->IP = gtk_menu_item_new_with_mnemonic("Path");
  gtk_menu_bar_append(GTK_MENU_BAR(widgets->MB), widgets->IP);
  widgets->MP = gtk_menu_new();
  gtk_menu_item_set_submenu(GTK_MENU_ITEM(widgets->IP), widgets->MP);
  widgets->ICP = gtk_menu_item_new_with_mnemonic("Calculate");
  gtk_menu_shell_append (GTK_MENU_SHELL (widgets->MP), widgets->ICP);
  //image to display a map
  widgets->I = gtk_image_new();
  //widgets for input
  widgets->LF = gtk_label_new("Origin:");
  widgets->SBF = gtk_spin_button_new_with_range(0,0,1);
  widgets->LT = gtk_label_new("Destination:");
  widgets->SBT = gtk_spin_button_new_with_range(0,0,1);
  //button to perform software elaboration
  widgets->BCP = gtk_button_new_with_mnemonic("Calculate Path");
  //containers
  //vertical box
  widgets->VB = gtk_vbox_new(false, 0);
  gtk_box_pack_start(GTK_BOX(widgets->VB), widgets->LF, FALSE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(widgets->VB), widgets->SBF, FALSE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(widgets->VB), widgets->LT, FALSE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(widgets->VB), widgets->SBT, FALSE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(widgets->VB), widgets->BCP, FALSE, FALSE, 0);
  //horizontal box
  widgets->HB = gtk_hbox_new(false, 0);
  gtk_box_pack_start(GTK_BOX(widgets->HB), widgets->MB, FALSE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(widgets->HB), widgets->I, FALSE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(widgets->HB), widgets->VB, FALSE, FALSE, 0);
  //add vertical box to the window
  gtk_container_add(GTK_CONTAINER(widgets->W), widgets->VB);
  //display widgets
  gtk_widget_show_all(widgets->W);
}

有人看到错误并帮助我显示 UI? :)

提前谢谢大家!

最佳答案

正如评论所说,您未能为小部件提供父子关系:

widgets->W 应该包含 widgets->HB 而不是 widgets->VB。

如果您可以从终端运行您的程序(如果您在 Windows 上,“cmd”应该可以工作),那么当您将“VB”添加到“W”时,GTK 应该会警告您父级错误。

另请注意,您可能希望对“vbox”等中间对象以及在程序执行期间不会更改的对象使用局部声明。

另请注意,您也可以使用 glade 或通过 GtkBuilder Interface 手动构建 XML 界面。 .

恕我直言,仅当界面需要在程序执行期间动态更改时,才应使用以编程方式构建的 GUI。

关于具有空白 UI 和 GTK+ 2.0 的 C++ 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32244003/

相关文章:

c - 在开罗绘制并定位许多 png 文件

c++ - C++如何处理双重移动?

c++ - 应该打印大小写的数量但返回 1 并退出程序

c++ - 为什么拥有作业并在其他线程中等待它们会导致整个应用程序等待?

c++ - 如何比较并获取两个列表中未包含的值

c - 使用 Gnome 库 (GDK) 获取键盘修改器状态仅获取初始状态

javascript - getBoundingClientRect() 如何与框大小交互?

multithreading - windows phone 7中UI控件的线程亲和性

wpf - 将 View 拆分为两个单独的 View

c - Gtk 图像在 C 中不显示