【发布时间】: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->W), widgets->HB);。注意使用HB而不是VB。您应该在 stderr 上收到关于为控件提供两个父母的警告。
标签: c++ user-interface gtk