4

これは私がこれまでに持っているものです

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;

}

テキストがボックスを埋め始めたときにテキストビューをスクロール可能にしたいのですが、ボックスはより多くのテキストを収容するために拡大し続けます。テキスト ビューのサイズを制限し、スクロール可能なテキスト ビューを作成します。

前もって感謝します :-)

4

2 に答える 2

13

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;
}
于 2011-12-07T10:42:38.817 に答える
1

これは、ウィジェットが親コンテナーにより多くのスペースを要求した結果です。親コンテナに拡張を禁止するルールがない限り、子ウィジェットが要求するだけのスペースが与えられます。

これを回避する一般的な方法は、子ウィジェットの特定のサイズを で設定しgtk_widget_set_size_request()、その後、親のプロパティに応じて、親が縮小または拡大できることを確認する何らかの方法を実行することです。

このサンプル コードは、これを実現する 1 つの方法を示しています。

#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 に設定されていた場合、テキストエリアは指定されたサイズのままで、コンテナは GtkTable 内の個々のウィジェット間に多くの余分なスペースを配置します。

于 2011-12-06T22:07:36.930 に答える