C++;带有GTK+的空白用户界面的程序;2 我用GTK库(2版)编写了一个C++软件,用于UI。
编译(使用makefile)没有错误,但当我执行程序时,窗口显示为空 我想我在创建接口的代码中犯了一些错误。 特别是我对小部件的定位和大小有一些疑问 .h接口文件由struct widgets_t声明(包含指向接口小部件的所有指针)和函数build_接口声明(创建和初始化UI)组成 .cpp接口文件为C++;带有GTK+的空白用户界面的程序;2 我用GTK库(2版)编写了一个C++软件,用于UI。,c++,user-interface,gtk,C++,User Interface,Gtk,编译(使用makefile)没有错误,但当我执行程序时,窗口显示为空 我想我在创建接口的代码中犯了一些错误。 特别是我对小部件的定位和大小有一些疑问 .h接口文件由struct widgets_t声明(包含指向接口小部件的所有指针)和函数build_接口声明(创建和初始化UI)组成 .cpp接口文件为 #include <gtk/gtk.h> #include "interface.h" void build_interface (widgets_t *widgets) { //
#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);
}
#包括
#包括“interface.h”
void build_接口(widgets_t*widgets)
{
//窗口
窗口小部件->W=gtk_窗口_新建(gtk_窗口_顶层);
gtk_窗口设置标题(gtk_窗口(小部件->W),“myNavigator”);
gtk_窗口设置默认大小(gtk_窗口(小部件->W),800600);
gtk_窗口设置_位置(gtk_窗口(窗口小部件->W),gtk_WIN_位置无);
//菜单栏
widgets->MB=gtk_菜单_栏_新建();
widgets->IF=gtk_菜单_项_新建_,带助记符(“文件”);
gtk_菜单_栏_附加(gtk_菜单_栏(小部件->MB),小部件->如果);
widgets->MF=gtk_菜单_新建();
gtk_菜单项设置子菜单(gtk_菜单项(widgets->IF),widgets->MF);
widgets->IQ=gtk_菜单_项_新建_,带助记符(“关闭”);
gtk_menu_shell_append(gtk_menu_shell(widgets->MF),widgets->IQ);
widgets->IM=gtk_菜单_项_新建_,带助记符(“地图”);
gtk_菜单栏_附加(gtk_菜单栏(小部件->MB),小部件->IM);
widgets->MM=gtk_菜单_新建();
gtk_菜单项设置子菜单(gtk_菜单项(小部件->IM),小部件->MM);
widgets->ILM=gtk_菜单项_新建_,带有助记符(“加载”);
gtk_菜单_外壳_附加(gtk_菜单_外壳(小部件->MM),小部件->ILM);
widgets->IP=gtk_菜单_项_新建_,带助记符(“路径”);
gtk_菜单_栏_附加(gtk_菜单_栏(小部件->MB),小部件->IP);
widgets->MP=gtk_menu_new();
gtk_菜单项设置子菜单(gtk_菜单项(小部件->IP),小部件->MP);
widgets->ICP=gtk_菜单_项_新建_,带助记符(“计算”);
gtk_菜单_外壳_附加(gtk_菜单_外壳(小部件->MP),小部件->ICP);
//要显示地图的图像
widgets->I=gtk_image_new();
//用于输入的小部件
小部件->LF=gtk_标签_新(“来源:”);
widgets->SBF=gtk_旋转_按钮_新建_,范围为(0,0,1);
widgets->LT=gtk_标签_新(“目的地:”);
widgets->SBT=gtk_旋转_按钮_新建_,范围为(0,0,1);
//执行软件精化的按钮
widgets->BCP=gtk_按钮_new_,带有助记符(“计算路径”);
//容器
//垂直盒
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);
//水平盒
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);
//将垂直框添加到窗口
gtk_容器添加(gtk_容器(小部件->W),小部件->VB);
//显示小部件
gtk_widget_show_all(widgets->W);
}
有人发现了一些错误并帮助我显示UI?:)
提前谢谢大家 正如评论中所说,您未能为小部件设置家长: widgets->W应该包含widgets->HB,而不是widgets->VB 如果您可以从终端运行您的程序(如果您使用的是windows“cmd”应该可以运行),那么当您将“VB”添加到“W”时,GTK应该警告您错误的家长行为 还请注意,您可能希望对中间对象(如“vboxes”)以及在程序执行期间不会更改的对象使用本地声明 还请注意,您也可以使用glade或通过手动方式在XML中构建接口
仅当在程序执行过程中需要更改界面时,才应使用IMHO以编程方式构建的GUI。如注释所述,您未能创建小部件: widgets->W应该包含widgets->HB,而不是widgets->VB 如果您可以从终端运行您的程序(如果您使用的是windows“cmd”应该可以运行),那么当您将“VB”添加到“W”时,GTK应该警告您错误的家长行为 还请注意,您可能希望对中间对象(如“vboxes”)以及在程序执行期间不会更改的对象使用本地声明 还请注意,您也可以使用glade或通过手动方式在XML中构建接口
只有当界面在程序执行期间需要进行动态更改时,才应使用IMHO编程构建的GUI。我想你的意思是说
gtk\u container\u add(gtk\u container(widgets->W),widgets->HB)代码>。注意使用了HB
而不是VB
。你应该在stderr上收到一条关于给控件两个父控件的警告。我想你的意思是说gtk\u container\u add(gtk\u container(widgets->W),widgets->HB)代码>。注意使用了HB
而不是VB
。您应该在stderr上收到一条关于为控件提供两个父控件的警告。