如何使用 libsigc++ 将 GTK+ 信号不是 gtkmm连接到非静态类方法?

问题描述

目标是在不使用 gtkmm 的情况下使用 libsigc++ 将 GTK+ 信号连接到非静态类方法。我想使用 Glade 用户界面设计器来设计一个具有许多视图的非平凡 UI,类似于设置向导。 UI 应该是可移植的(嵌入式 Linux 和 Windows)。所以,我想减少依赖,只使用 C GTK+,没有 C++ 语言绑定组件 gtkmm,但 UI 应该用 C++ 编写。应该应用MVC模式来分离职责和解耦。因此,我的 C++ 视图和其他类必须使用 g_signal_connect() 将它们的信号处理程序连接到 GTK+ C 信号。稍后他们必须使用 g_signal_handlers_disconnect_by_func() 断开处理程序。下面的例子演示了这个问题:

文件:GladeProgram.h

#ifndef _GLADEPROGRAMM_H
#define _GLADEPROGRAMM_H

#include "gtk/gtk.h"

class GladeProgram
{
public:
  GladeProgram(int argc,char *argv[]);
  virtual ~GladeProgram();

  void Run();
  void Exit();
};

#endif // !_GLADEPROGRAMM_H

文件:GladeProgram.cpp

#include "GladeProgram.h"
#include "sigc++/sigc++.h"

GladeProgram::GladeProgram(int argc,char *argv[])
{
  gtk_init(&argc,&argv);
}

GladeProgram::~GladeProgram()
{
}

// C-style callback method with object pointer
void onExit(GladeProgram* pProg)
{
  pProg->Exit();
}

void GladeProgram::Run()
{
  GtkBuilder *builder;
  GtkWidget  *window;

  builder = gtk_builder_new_from_file("window_main.glade");

  window  = GTK_WIDGET(gtk_builder_get_object(builder,"window_main"));    

  // C-style signal handler with object pointer
  g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(onExit),this);

  // PROBLEM: Howto connect non-static class method GladeProgram::Exit() with libsigc++ ???
  // g_signal_connect(G_OBJECT(window),G_CALLBACK( ??? ),NULL);

  g_object_unref(builder);

  gtk_widget_show(window);

  gtk_main();
}

void GladeProgram::Exit()
{
  gtk_main_quit();
}

文件:Main.cpp

#include <iostream>
#include "GladeProgram.h"

using namespace std;

int main(int argc,char *argv[])
{
  std::cout << "**********************************************************************" << endl;
  std::cout << "*                             GTK+ Test UI                           *" << endl;
  std::cout << "**********************************************************************" << endl;

  GladeProgram prog(argc,argv);

  prog.Run();

  // wait until the Enter key is pressed
  cout << endl << "Press [Enter] to exit." << endl;  
  cin.get();

  return 0;
}

测试程序(控制台程序)目前在Windows 10上运行,使用Visual Studio 2017编译。

感谢任何帮助。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)