我有一个简单的程序,在ubuntu中用gtk2.0编译。在ubuntu11.04我安装gtk3.then我编译相同的代码,我在下面的行中出错
/* Add a timer callback to update the value of the progress bar */
timer = gtk_timeout_add (100, progress_timeout, pdata);
我只是评论该行并重新编译它。然后我得到了输出文件。但是如果没有注释行,它就无法正常工作。
在gtk2.0中我用以下命令编译
gcc progressbar.c `pkg-config --cflags --libs gtk+-2.0`
和gtk3
gcc progressbar.c `pkg-config --cflags --libs gtk+-3.0`
我有一个疑问,是否有任何弃用在gtk3.please中的方法给我链接到一个简单的文档与examples.what是2和3之间的主要区别。 完整的源代码如下所示
#include <gtk/gtk.h>
typedef struct _ProgressData {
GtkWidget *pbar;
} ProgressData;
gint progress_timeout( gpointer data )
{
ProgressData *pdata = (ProgressData *)data;
gdouble new_val;
new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
if (new_val > 1.0)
new_val = 0.0;
gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
return TRUE;
}
int main( int argc,
char *argv[])
{
ProgressData *pdata;
GtkWidget *align;
GtkWidget *window;
int timer;
GtkWidget *vbox;
gtk_init (&argc, &argv);
/* Allocate memory for the data that is passed to the callbacks */
pdata = g_malloc (sizeof (ProgressData));
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
g_signal_connect ( window, "destroy", gtk_main_quit, NULL ) ;
gtk_window_set_title (GTK_WINDOW (window), "GtkProgressBar");
gtk_container_set_border_width (GTK_CONTAINER (window), 0);
vbox = gtk_vbox_new (FALSE, 5);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
gtk_container_add (GTK_CONTAINER (window), vbox);
gtk_widget_show (vbox);
/* Create a centering alignment object */
align = gtk_alignment_new (0.5, 0.5, 0, 0);
gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 5);
gtk_widget_show (align);
/* Create the GtkProgressBar */
pdata->pbar = gtk_progress_bar_new ();
gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
gtk_widget_show (pdata->pbar);
/* Add a timer callback to update the value of the progress bar */
timer = gtk_timeout_add (100, progress_timeout, pdata);
gtk_widget_show (window);
gtk_main ();
return 0;
}
答案 0 :(得分:4)
您需要将gtk_timeout_add
来电更改为g_timeout_add
。
guint gtk_timeout_add (guint32 interval,
GtkFunction function,
gpointer data);
Warning
gtk_timeout_add has been deprecated since version 2.4 and should not be used in
newly-written code. Use g_timeout_add() instead.
Google“gtk_timeout_add g_timeout_add”会为您提供示例,例如这一个,http://gna.org/patch/?2563。
答案 1 :(得分:4)
正如jesse告诉你的那样,你正在使用gtk_timeout_add
,这在GTK2中已被弃用。 GTK2中弃用的所有符号都在GTK3中删除。
要使您的程序在GTK3中运行,您需要确保不使用任何GTK2弃用的符号。为此,use symbols like G_DISABLE_DEPRECATED (for GLib), GTK_DISABLE_DEPRECATED等可以帮助您确保在使用GTK2进行编译时,您没有使用在GTK3中删除的符号。
还可以使用GTK2 to GTK3 migration guide,以及一些GNOME目标,这些目标链接到GNOME中用于完成相同任务的修补程序,用于GLib和{{3} }符号。