这是我到目前为止所拥有的
GtkWidget* createConsoleBox()
{
GtkWidget* textArea = gtk_text_view_new();
GtkWidget* scrollbar = gtk_vscrollbar_new(gtk_text_view_get_vadjustment(GTK_TEXT_VIEW(textArea)));
GtkWidget* textEntry = gtk_entry_new();
GtkWidget* console = gtk_table_new(3, 2, FALSE);
gtk_table_attach_defaults(GTK_TABLE(console), textArea, 0, 1, 0, 1);
gtk_table_attach_defaults(GTK_TABLE(console), scrollbar, 1, 2, 0, 1);
gtk_table_attach_defaults(GTK_TABLE(console), textEntry, 0, 2, 1, 2);
return console;
}
我希望文本视图可以滚动,因为文本开始填充框,但框继续展开以容纳更多文本。如何限制文本视图的大小并创建可滚动的文本视图。
提前致谢: - )
答案 0 :(得分:8)
我担心你误解了滚动条在GTK中是如何工作的;通常您不直接创建滚动条,但是您要在GtkScrolledWindow
中放置要滚动的小部件。这会自动创建滚动条并将它们连接到滚动窗口内的窗口小部件;在您的情况下,文本视图。
以下是createConsoleBox()
函数的外观:
GtkWidget* createConsoleBox()
{
GtkWidget* textArea = gtk_text_view_new();
GtkWidget* scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
GtkWidget* textEntry = gtk_entry_new();
GtkWidget* console = gtk_table_new(3, 1, FALSE);
gtk_container_add(GTK_CONTAINER(scrolledwindow), textArea);
gtk_table_attach_defaults(GTK_TABLE(console), scrolledwindow, 0, 1, 0, 1);
gtk_table_attach_defaults(GTK_TABLE(console), textEntry, 0, 1, 1, 2);
return console;
}
答案 1 :(得分:1)
您遇到的是小部件向其父容器请求更多空间的结果。 除非父容器有一些禁止扩展的规则,否则它将提供与子窗口小部件一样多的空间。
避免这种情况的常用方法是使用gtk_widget_set_size_request()
为子窗口小部件设置给定大小,然后根据父属性确定父级可以缩小或增长。
此示例代码显示了实现此目的的一种方法。
#include <gtk/gtk.h>
GtkWidget* createConsoleBox()
{
GtkWidget* textArea = gtk_text_view_new();
GtkWidget* scrollbar= gtk_vscrollbar_new(gtk_text_view_get_vadjustment(GTK_TEXT_VIEW(textArea)));
GtkWidget* textEntry = gtk_entry_new();
GtkWidget* console = gtk_table_new(3, 2, FALSE);
gtk_table_attach_defaults(GTK_TABLE(console), textArea, 0, 1, 0, 1);
gtk_table_attach_defaults(GTK_TABLE(console), scrollbar, 1, 2, 0, 1);
gtk_table_attach_defaults(GTK_TABLE(console), textEntry, 0, 2, 1, 2);
//This code sets the preferred size for the widget, so it does not ask for extra space
gtk_widget_set_size_request(textArea, 320, 240);
return console;
}
int main(int argc,char* argv[]){
GtkWidget *window;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Simple Sample");
gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);// does not matter this size
gtk_container_add(GTK_CONTAINER(window), createConsoleBox());
gtk_widget_show_all(window);
gtk_window_set_resizable(GTK_WINDOW(window),FALSE);//because of this
gtk_main();
return 0;
}
gtk_window_set_resizable()
旨在使用户无法调整窗口大小(应用程序仍可以调整大小),但具有将窗口紧缩到其子窗口小部件大小的额外属性。每个GtkContainer都有它设置扩展,紧密等方式。只需要实验就可以找到适合您需求的产品。
如果窗口可调整大小属性已设置为TRUE,则textarea仍然具有给定的大小,容器将在GtkTable中的各个小部件之间放置大量额外空间。