【问题标题】:C++ program with blank UI with GTK+ 2.0带有 GTK+ 2.0 的空白 UI 的 C++ 程序
【发布时间】:2026-02-05 03:40:01
【问题描述】:

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

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

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

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

.cpp 接口文件是

#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? :)

提前谢谢大家!

【问题讨论】:

  • 我想你的意思是说gtk_container_add(GTK_CONTAINER(widgets-&gt;W), widgets-&gt;HB);。注意使用HB 而不是VB。您应该在 stderr 上收到关于为控件提供两个父母的警告。

标签: c++ user-interface gtk


【解决方案1】:

正如评论所说,您未能养育小部件:

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

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

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

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

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

【讨论】:

    最近更新 更多