You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现GTK3窗口局部可滚动?(C语言+Glade开发场景)

GTK3+Glade+C 局部滚动布局实现求助

我正在使用GTK3、Glade和C语言开发程序,需要让某一窗口的局部区域(滚动区域总大小固定)实现可滚动效果:滚动条左侧区域可滚动以展示图片,右侧区域保持固定。目前我遇到了实现困难,以下是我编写的代码,同时附上Glade组件结构和窗口设计的截图说明:

  • Glade组件结构:album窗口下包含fixed容器、滚动条(album_scroll)、网格(album_grid)、视图(album_view)等组件
  • 窗口设计布局:左侧为需要滚动的图片展示区,右侧为固定区域,底部设置了滚动条
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <gtk/gtk.h>
#include <gtk/gtkx.h>
#include <math.h>
#include <ctype.h>

//login window
GtkBuilder  *builder;
GtkWidget   *window;
GtkWidget   *fixed1;
GtkWidget   *button1;
GtkWidget   *button2;
GtkWidget   *label1;
GtkWidget   *entry1;
GtkWidget   *entry2;
GtkWidget   *icon_entry;
GtkWidget   *image;

//register window
GtkWidget *r_window, *r_fixed;
GtkWidget *r_button1, *r_button2, *r_label;
GtkWidget *r_entry1, *r_entry2, *r_entry3;
GtkWidget *r_image;

//menu window
GtkWidget *menu_win, *menu_fixed;
GtkWidget *menu_button1, *menu_button2, *menu_button3;
GtkWidget *menu_button4, *menu_button5, *menu_button6;

//album window
GtkWidget *album_win,  *album_fixed;
GtkWidget *album_grid, *album_label1, *album_label2;
GtkWidget *album_view, *album_scroll;

//showing functions
void register_s (){
gtk_widget_show(r_window);
}
void login_s (){
gtk_widget_show(window);
}
void menu_s (){
gtk_widget_show(menu_win);
}
void album_s (){
gtk_widget_show(album_win);
}

//hiding functions
void register_h (){
gtk_widget_hide(r_window);
}
void login_h (){
gtk_widget_hide(window);
}
void menu_h (){
gtk_widget_hide(menu_win);
}
void album_h (){
gtk_widget_hide(album_win);
}

int main(int argc, char *argv[]) {

    gtk_init(&argc, &argv); 
    builder = gtk_builder_new_from_file ("testing.glade");

//login window
window = GTK_WIDGET(gtk_builder_get_object(builder, "login_window"));
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    fixed1 = GTK_WIDGET(gtk_builder_get_object(builder, "fixed1"));
    label1 = GTK_WIDGET(gtk_builder_get_object(builder, "label1"));
    entry1 = GTK_WIDGET(gtk_builder_get_object(builder, "entry1"));
    entry2 = GTK_WIDGET(gtk_builder_get_object(builder, "entry2"));
    image = GTK_WIDGET(gtk_builder_get_object(builder, "image"));
    
    button1 = GTK_WIDGET(gtk_builder_get_object(builder, "button1"));
    g_signal_connect(button1, "clicked", G_CALLBACK(register_s), NULL);
    g_signal_connect(button1, "clicked", G_CALLBACK(login_h), NULL);
    
    button2 = GTK_WIDGET(gtk_builder_get_object(builder, "button2"));
    g_signal_connect(button2, "clicked", G_CALLBACK(menu_s), NULL);
    g_signal_connect(button2, "clicked", G_CALLBACK(login_h), NULL);
    
    
    gtk_builder_connect_signals(builder, NULL);

//register window
r_window = GTK_WIDGET(gtk_builder_get_object(builder, "r_window"));
g_signal_connect(r_window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    r_button1 = GTK_WIDGET(gtk_builder_get_object(builder, "r_button1"));
    
    r_button2 = GTK_WIDGET(gtk_builder_get_object(builder, "r_button2"));
    g_signal_connect(r_button2, "clicked", G_CALLBACK(login_s), NULL);
    g_signal_connect(r_button2, "clicked", G_CALLBACK(register_h), NULL);
    
    r_entry1 = GTK_WIDGET(gtk_builder_get_object(builder, "r_entry1"));
    r_entry2 = GTK_WIDGET(gtk_builder_get_object(builder, "r_entry2"));
    r_entry3 = GTK_WIDGET(gtk_builder_get_object(builder, "r_entry3"));
    r_fixed = GTK_WIDGET(gtk_builder_get_object(builder, "r_fixed"));
    r_label = GTK_WIDGET(gtk_builder_get_object(builder, "r_label"));
    r_image = GTK_WIDGET(gtk_builder_get_object(builder, "r_image"));

//menu window
menu_win = GTK_WIDGET(gtk_builder_get_object(builder, "menu_win"));
g_signal_connect(menu_win, "destroy", G_CALLBACK(gtk_main_quit), NULL);
menu_fixed = GTK_WIDGET(gtk_builder_get_object(builder, "menu_fixed"));

    menu_button1 = GTK_WIDGET(gtk_builder_get_object(builder, "menu_button1"));
    g_signal_connect(menu_button1, "clicked", G_CALLBACK(album_s), NULL);
    g_signal_connect(menu_button1, "clicked", G_CALLBACK(menu_h), NULL);
    menu_button2 = GTK_WIDGET(gtk_builder_get_object(builder, "menu_button2"));
    menu_button3 = GTK_WIDGET(gtk_builder_get_object(builder, "menu_button3"));
    menu_button4 = GTK_WIDGET(gtk_builder_get_object(builder, "menu_button4"));
    menu_button5 = GTK_WIDGET(gtk_builder_get_object(builder, "menu_button5"));
    menu_button6 = GTK_WIDGET(gtk_builder_get_object(builder, "menu_button6"));
    g_signal_connect(menu_button6, "clicked", G_CALLBACK(gtk_main_quit), NULL);

//album window
album_win = GTK_WIDGET(gtk_builder_get_object(builder, "album_win"));
g_signal_connect(album_win, "destroy", G_CALLBACK(gtk_main_quit), NULL);
album_fixed = GTK_WIDGET(gtk_builder_get_object(builder, "album_fixed"));

    album_grid = GTK_WIDGET(gtk_builder_get_object(builder, "album_grid"));
    album_view = GTK_WIDGET(gtk_builder_get_object(builder, "album_view"));
    album_scroll = GTK_WIDGET(gtk_builder_get_object(builder, "album_scroll"));
    gtk_range_set_range (GTK_RANGE(album_scroll), 0, 600 );
    //g_signal_connect(album_scroll, "change-value", G_CALLBACK(), NULL);
    album_label1 = GTK_WIDGET(gtk_builder_get_object(builder, "album_label1"));
    album_label2 = GTK_WIDGET(gtk_builder_get_object(builder, "album_label2"));

//main functions

    gtk_widget_show(window);
    gtk_main();
    
    return EXIT_SUCCESS;

}//main

需求

我是编程新手,希望得到简单易懂的步骤指导,完成左侧滚动、右侧固定的布局效果。


内容的提问来源于stack exchange,提问作者Kawano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:40:26