微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何使用 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 举报,一经查实,本站将立刻删除。