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