我正在使用GTK +(不是gtkmm)在C ++中编写应用程序,因此我需要使用g ++编译器进行编译。是否可以使用g ++编译器来编译GTK +应用程序?GTK +和库是否与g ++编译器兼容?
我试图将GTK +函数调用嵌入到如下所示的类中:
#include <gtk/gtk.h>
class LoginWindow
{
public:
LoginWindow();
void on_window_destroy( GtkObject *object, gpointer user_data);
private:
GtkBuilder *builder;
GtkWidget *window;
};
LoginWindow::LoginWindow()
{
builder = gtk_builder_new ();
gtk_builder_add_from_file (builder, "login_window.glade", NULL);
window = GTK_WIDGET (gtk_builder_get_object (builder, "login_window"));
gtk_builder_connect_signals (builder, NULL);
g_signal_connect( GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(on_window_destroy), NULL );
g_object_unref (G_OBJECT (builder));
gtk_widget_show (window);
}
void LoginWindow::on_window_destroy (GtkObject *object, gpointer user_data)
{
gtk_main_quit ();
}
int main (int argc, char *argv[])
{
gtk_init (&argc, &argv);
LoginWindow loginWindow;
gtk_main ();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我做对了吗?我在网上遇到编译错误:
g_signal_connect( GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(on_window_destroy), NULL );
login_window.cpp: In constructor "LoginWindow::LoginWindow()":
login_window.cpp:27: error: invalid use of member (did you forget the "&" ?)
Run Code Online (Sandbox Code Playgroud)
正确的做法是什么?
Gtk +是一个基于C的库,因此您不能将其类成员函数用作回调。要么将C样式函数定义为回调,即
extern "C"
void on_window_destroy( GtkObject *object, gpointer user_data)
{
// do yer stuff.. keep in mind, there's no this-pointer here, it's not
// associated with an object
}
Run Code Online (Sandbox Code Playgroud)
在任何类声明之外。注册信号时,您可能希望将LoginWindow对象本身添加为user_data,并在进入方法并转发调用时简单地将其强制转换,就像这样
extern "C"
void on_window_destroy( GtkObject *object, gpointer user_data)
{
static_cast<LoginWindow*>(user_data)->on_window_destroy();
}
Run Code Online (Sandbox Code Playgroud)
如果您想使用c ++风格,请查看gtkmm,它是Gtk +的c ++包装器,它将为您带来更多的OOP。在gtkmm中使用信号/回调会比较麻烦,但是它是安全的类型,最终将为您省去很多麻烦。
归档时间: |
|
查看次数: |
2231 次 |
最近记录: |