C++ Linux/C++;glade3和gtkmm的帮助

C++ Linux/C++;glade3和gtkmm的帮助,c++,glade,gtkmm,C++,Glade,Gtkmm,下面是一个C应用程序源代码,它使用Glade3和GTK2+创建GUI: // gcc -o simple simple.c $(pkg-config --cflags --libs gtk+-2.0 gmodule-2.0) #include <stdio.h> #include <stdlib.h> #include <string.h> #include <gtk/gtk.h> GtkBuilder *builder; GtkWidget

下面是一个C应用程序源代码,它使用Glade3和GTK2+创建GUI:

// gcc -o simple simple.c $(pkg-config --cflags --libs gtk+-2.0 gmodule-2.0)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gtk/gtk.h>

GtkBuilder *builder;
GtkWidget  *window1;

G_MODULE_EXPORT void on_window1_destroy (GtkObject *object, gpointer user_data)
{
    gtk_main_quit();
}

G_MODULE_EXPORT void on_button2_clicked (GtkObject *object, gpointer user_data)
{
    gtk_main_quit();
}

G_MODULE_EXPORT void on_button1_clicked (GtkObject *object, gpointer user_data)
{
    const gchar *name;
    GtkWidget *name_entry = GTK_WIDGET(gtk_builder_get_object(builder, "entry1"));
    name = gtk_entry_get_text(GTK_ENTRY(name_entry));
    g_print("Name is: %s\n", name);
}

int main(int argc, char** argv)
{
    GError     *error = NULL;

    /* Init GTK+ */
    gtk_init( &argc, &argv );

    /* Create new GtkBuilder object */
    builder = gtk_builder_new();
    /* Load UI from file. If error occurs, report it and quit application.*/
    if( ! gtk_builder_add_from_file( builder, "simple.glade", &error ) )
    {
        g_warning( "%s", error->message );
        g_free( error );
        return( 1 );
    }

    /* Get main window pointer from UI */
    window1 = GTK_WIDGET( gtk_builder_get_object( builder, "window1" ) );

    /* Connect signals */
    gtk_builder_connect_signals( builder, NULL );

    /* Destroy builder, since we don't need it anymore */
    //g_object_unref( G_OBJECT( builder ) );

    /* Show window. All other widgets are automatically shown by GtkBuilder */
    gtk_widget_show( window1 );

    /* Start main loop */
    gtk_main();

    return( 0 );
}
//gcc-o simple.c$(pkg-config--cflags--libs-gtk+-2.0 gmodule-2.0)
#包括
#包括
#包括
#包括
GtkBuilder*builder;
GtkWidget*窗口1;
G_模块在窗口上导出无效1_销毁(GtkObject*对象,gpointer用户数据)
{
gtk_main_quit();
}
G_模块在按钮2_上导出无效(GtkObject*对象,gpointer用户数据)
{
gtk_main_quit();
}
G_模块在单击按钮1时导出无效(GtkObject*对象,gpointer用户数据)
{
const gchar*名称;
GtkWidget*name_entry=GTK_小部件(GTK_生成器_get_对象(生成器,“entry1”);
name=gtk_条目_获取_文本(gtk_条目(name_条目));
g_print(“名称为:%s\n”,名称);
}
int main(int argc,字符**argv)
{
GError*error=NULL;
/*初始化GTK+*/
gtk_init(&argc,&argv);
/*创建新的GtkBuilder对象*/
builder=gtk_builder_new();
/*从文件加载UI。如果发生错误,请报告并退出应用程序*/
if(!gtk_builder_从_文件添加_(builder,“simple.glade”,&error))
{
g_警告(“%s”,错误->消息);
g_自由(错误);
申报表(1);
}
/*从UI获取主窗口指针*/
window1=GTK_小部件(GTK_生成器_获取_对象(生成器,“window1”));
/*连接信号*/
gtk_builder_connect_信号(builder,NULL);
/*摧毁建筑商,因为我们不再需要它了*/
//g_object_unref(g_object(builder));
/*显示窗口。所有其他小部件由GtkBuilder自动显示*/
gtk_widget_show(窗口1);
/*启动主回路*/
gtk_main();
返回(0);
}
还有林间空地档案:

<?xml version="1.0"?>
<interface>
  <requires lib="gtk+" version="2.16"/>
  <!-- interface-naming-policy project-wide -->
  <object class="GtkWindow" id="window1">
    <signal name="destroy" handler="on_window1_destroy"/>
    <child>
      <object class="GtkTable" id="table1">
        <property name="visible">True</property>
        <property name="n_rows">2</property>
        <property name="n_columns">2</property>
        <child>
          <object class="GtkHButtonBox" id="hbuttonbox1">
            <property name="visible">True</property>
            <child>
              <object class="GtkButton" id="button1">
                <property name="label" translatable="yes">OK</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
                <signal name="clicked" handler="on_button1_clicked"/>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">False</property>
                <property name="position">0</property>
              </packing>
            </child>
          </object>
          <packing>
            <property name="top_attach">1</property>
            <property name="bottom_attach">2</property>
          </packing>
        </child>
        <child>
          <object class="GtkHButtonBox" id="hbuttonbox2">
            <property name="visible">True</property>
            <child>
              <object class="GtkButton" id="button2">
                <property name="label" translatable="yes">Exit</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
                <signal name="clicked" handler="on_button2_clicked"/>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">False</property>
                <property name="position">0</property>
              </packing>
            </child>
          </object>
          <packing>
            <property name="left_attach">1</property>
            <property name="right_attach">2</property>
            <property name="top_attach">1</property>
            <property name="bottom_attach">2</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label1">
            <property name="visible">True</property>
            <property name="label" translatable="yes">Enter your name:</property>
          </object>
        </child>
        <child>
          <object class="GtkEntry" id="entry1">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="invisible_char">&#x25CF;</property>
          </object>
          <packing>
            <property name="left_attach">1</property>
            <property name="right_attach">2</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

真的
2.
2.
真的
好啊
真的
真的
真的
假的
假的
0
1.
2.
真的
出口
真的
真的
真的
假的
假的
0
1.
2.
1.
2.
真的
输入您的姓名:
真的
真的
●;
1.
2.

现在我想用C++来编码这个应用程序。有人能给出使用gtkmm的示例或教程吗?或者最好为我转换这个简单的例子?提前谢谢

我建议你读这本书

我可以费心将其全部转换,但它看起来是这样的:

void button1_clicked()
{
  ...
}

int main(int argc, char argv)
{
  Gtk::Main kit(argc, argv);

  Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("my_gui.ui");

  Gtk::Window *window1 = 0;
  builder->get_widget("window1", window1);
  Gtk::Button *button1 = 0;
  builder->get_widget("button1", button1);
  // get other widgets
  ...

  button1->signal_clicked().connect(sigc::mem_fun(*this, &button1_clicked));

  // connect more signals
  ...

  Gtk::Main::run(*m_main_window);

  return 0;
}
void按钮1\u点击()
{
...
}
int main(int argc、char argv)
{
Gtk::主套件(argc、argv);
Glib::RefPtr builder=Gtk::builder::从_文件(“my_gui.ui”)创建_;
Gtk::Window*window1=0;
生成器->获取小部件(“窗口1”,窗口1);
Gtk::按钮*按钮1=0;
生成器->获取小部件(“按钮1”,按钮1);
//获取其他小部件
...
按钮1->signal_clicked();
//连接更多信号
...
Gtk::Main::run(*m_Main_窗口);
返回0;
}

请注意,在使用gtkmm时,您不能使用Glade连接信号,您需要手动连接。

我有一个确切的问题,Glade是否为您连接信号。多谢。