c - 如何在C中更改gtk图像按钮
问题描述
我尝试了很多东西,但我无法更改按钮中的图像。就我而言,我想更改按钮的图像,以使我的应用程序全屏显示,反之亦然。我尝试在文档和论坛中使用几个功能,但似乎没有任何效果。你有什么解决方案可以提供给我吗?谢谢您的帮助 :)
以下是我在依赖你之前尝试的最后一件事:
#include <gtk/gtk.h>
#include <time.h>
#include <err.h>
typedef struct Application Application;
struct Application
{
//Builder
GtkBuilder *builder;
//Windows
GtkWidget *splashscreen;
GtkWidget *window_main;
//Buttons
GtkWidget *button_close;
GtkWidget *button_fullscreen;
//Image
GtkWidget *img_fullscreen;
GtkWidget *img_leave_fullscreen;
//Label
GtkLabel *progresslabel;
//ProgressBar
GtkProgressBar *progressbar;
//Error
GError *error;
//Data
int is_fullscreen;
};
//Doesn't work fine :( Impossible to change picture in the button
void change_fullscreen_mode(gpointer app_data){
Application *app = app_data;
/* Check if picture is fullscreen or not */
if(app->is_fullscreen == 1)
{
// try to assign appropriate picture to the button
gtk_button_set_image(GTK_BUTTON(app->button_fullscreen),
app->img_leave_fullscreen);
//unfullscreen the window of course
gtk_window_unfullscreen(GTK_WINDOW(app->window_main));
//set the variable that stands for this state
app->is_fullscreen = 0;
}
else
{
// try to assign appropriate picture to the button
gtk_button_set_image(GTK_BUTTON(app->button_fullscreen),
app->img_fullscreen);
//fullscreen the window of course
gtk_window_fullscreen(GTK_WINDOW(app->window_main));
//set the variable that stands for this state
app->is_fullscreen = 1;
}
}
int main(int argc, char *argv[])
{
//Init gtk
gtk_init(&argc, &argv);
Application app;
app.error = NULL;
app.is_fullscreen = 1;
//Create builder
app.builder = gtk_builder_new();
if( ! gtk_builder_add_from_file( app.builder, "app.glade", &(app.error)))
{
g_warning( "%s", app.error->message );
g_free( app.error );
return(1);
}
//Get back gtk object
app.splashscreen = GTK_WIDGET(gtk_builder_get_object(app.builder,
"splashscreen"));
app.progresslabel = GTK_LABEL(gtk_builder_get_object(app.builder,
"progresslabel"));
app.progressbar = GTK_PROGRESS_BAR(gtk_builder_get_object(app.builder,
"progressbar"));
app.window_main = GTK_WIDGET(gtk_builder_get_object(app.builder,
"window_main"));
app.button_close = GTK_WIDGET(gtk_builder_get_object(app.builder,
"button_close"));
app.button_fullscreen = GTK_WIDGET(gtk_builder_get_object(app.builder,
"button_fullscreen"));
//assign a picture for each mode
app.img_leave_fullscreen =
gtk_image_new_from_file("icons/tools/gtk-leave-fullscreen18x18.png");
app.img_fullscreen =
gtk_image_new_from_file("icons/tools/gtk-fullscreen18x18.png");
//fill the container with one picture (works find)
gtk_container_add(GTK_CONTAINER(app.button_fullscreen),
app.img_leave_fullscreen);
...
//Connect signals
gtk_builder_connect_signals(app.builder, NULL); //builder
g_signal_connect(app.window_main, "destroy", G_CALLBACK(gtk_main_quit),
NULL);
g_signal_connect(app.button_close, "clicked",
G_CALLBACK(gtk_main_quit), NULL);
//quit splashscreen
g_signal_connect (app.splashscreen, "destroy", G_CALLBACK (gtk_main_quit),
NULL);
//change fullscreen mode with the corresponding button
g_signal_connect(G_OBJECT(app.button_fullscreen), "clicked",
G_CALLBACK(change_fullscreen_mode), &app);
g_object_unref(app.builder);
gtk_widget_hide(app.window_main);
gtk_window_fullscreen(GTK_WINDOW(app.splashscreen));
gtk_widget_show(app.splashscreen);
eventstartCommand = g_timeout_add(5, on_start_commands, &app);
gtk_main();
return 0;
}
解决方案
推荐阅读
- java - 在 Java 中使用数组列表时出现堆栈溢出错误
- c# - EF Code First - 没有 FK 的导航属性
- razor - 如何在 ASP.Net Core 2 和 Razor 中创建多个单选按钮组?
- centos - Centos 6.9,如何安装gdbus-codegen?
- java - then() 方法在 REST-assured 中做了什么?
- php - Codeigniter 列出下一条和上一条记录的 ID url
- html - 我的标题不在中心
- sql - 将一个字段设置为另一个字段的值
- observers - 我正在尝试在 C# 上实现观察者模式,想知道我做对了吗?
- function - 两次调用一个程序会导致我的 masm 程序崩溃