How to set same width of widgets

,

Hello all,
I again need help with my gtk4 c++ aplication.

I that aplication I have list box. In that list box I put boxes with horizontal orientation as rows (I need it sort by rows).
In that box could be variable widgets such buttons, entries or labels.

And I also need that widgets in one column has the same physical size (even if they are different types (buttons, entries…))

I have tested function gtk_widget_set_size_request, but it does not work as I expect.

In my testing app I can change size by pressing button and reading requested value from first entry.

I Can also read actual size with function gtk_widget_get_size.

For example if app is started, I read size of widgets. So biggest widget is entry (value is 150 (width)). So I would like to sets all widgets to this size,
so I write 150 into first entry and press button “set all sizes widgets from entry1”. After button pressing are width of labels and buttons increased.
Buttons and labels have the same width, but still they are smaller than entry (but I have requested to set them the same size).

Another thing is that when I now again ask for widgets size (I expect all wigets have width 150). So entry and labels have 150 but buttons have only 116.

Another test is that I set size for all to 170 (e.g.) - all widgets ahe physicale the same, but if I reads theirs size they have it different (button =136, label = 170 and entry = 152).

And third question is how to change entrys size under its initial size?

Please could any body helps me, how to manipulate with sizes of widgets.

I must again notice, that I need it sort in horisontal boxes!

Thanks all for any advice.

Here is my testing ap code:

#include <gtk/gtk.h>
#include <iostream>
#include <string>

using namespace std;

GtkWidget *btn, *lab, *entry;
GtkWidget *btn2, *lab2, *entry2;

void ChangeSizeLab (GtkWidget* wid, GtkWidget* data) {
    string text = gtk_editable_get_text(GTK_EDITABLE(entry));
    int sizeWidg = atoi(text.c_str());
    gtk_widget_set_size_request(lab, sizeWidg, 0);
    gtk_widget_set_size_request(lab2, sizeWidg, 0);
}

void ChangeSizeBtn (GtkWidget* wid, GtkWidget* data) {
    string text = gtk_editable_get_text(GTK_EDITABLE(entry));
    int sizeWidg = atoi(text.c_str());
    gtk_widget_set_size_request(btn, sizeWidg, 0);
    gtk_widget_set_size_request(btn2, sizeWidg, 0);
}

void ChangeSizeEnt (GtkWidget* wid, GtkWidget* data) {
    string text = gtk_editable_get_text(GTK_EDITABLE(entry));
    int sizeWidg = atoi(text.c_str());
    gtk_widget_set_size_request(entry, sizeWidg, 0);
    gtk_widget_set_size_request(entry2, sizeWidg, 0);
}

void ChangeSizeFromEnt (GtkWidget* wid, GtkWidget* data) {
    string text = gtk_editable_get_text(GTK_EDITABLE(entry));
    int sizeWidg = atoi(text.c_str());
    gtk_widget_set_size_request(entry, sizeWidg, 0);
    gtk_widget_set_size_request(entry2, sizeWidg, 0);
    gtk_widget_set_size_request(lab, sizeWidg, 0);
    gtk_widget_set_size_request(lab2, sizeWidg, 0);
    gtk_widget_set_size_request(btn, sizeWidg, 0);
    gtk_widget_set_size_request(btn2, sizeWidg, 0);
}

void ReadsSizes () {
    cout << "size btn: " << to_string (gtk_widget_get_size(btn,GTK_ORIENTATION_HORIZONTAL)) << " x " << to_string (gtk_widget_get_size(btn,GTK_ORIENTATION_VERTICAL)) << endl;
    cout << "size btn2: " << to_string (gtk_widget_get_size(btn2,GTK_ORIENTATION_HORIZONTAL)) << " x " << to_string (gtk_widget_get_size(btn2,GTK_ORIENTATION_VERTICAL)) << endl;

    cout << "size lab: " << to_string (gtk_widget_get_size(lab,GTK_ORIENTATION_HORIZONTAL))<< " x " << to_string (gtk_widget_get_size(lab,GTK_ORIENTATION_VERTICAL)) << endl;
    cout << "size lab2: " << to_string (gtk_widget_get_size(lab2,GTK_ORIENTATION_HORIZONTAL))<< " x " << to_string (gtk_widget_get_size(lab2,GTK_ORIENTATION_VERTICAL)) << endl;

    cout << "size entry: " << to_string (gtk_widget_get_size(entry,GTK_ORIENTATION_HORIZONTAL)) << " x " << to_string (gtk_widget_get_size(entry,GTK_ORIENTATION_VERTICAL)) << endl;
    cout << "size entry2: " << to_string (gtk_widget_get_size(entry2,GTK_ORIENTATION_HORIZONTAL)) << " x " << to_string (gtk_widget_get_size(entry2,GTK_ORIENTATION_VERTICAL)) << endl;
}

void ChangeTexts (GtkWidget* wid, GtkWidget* data) {
    cout << "ChangeTexts"<< endl;

    ReadsSizes();

    string text = gtk_editable_get_text(GTK_EDITABLE(entry));
    gtk_button_set_label(GTK_BUTTON(btn),text.c_str());
    gtk_button_set_label(GTK_BUTTON(btn2),text.c_str());
    gtk_label_set_label(GTK_LABEL(lab),text.c_str());
    gtk_label_set_label(GTK_LABEL(lab2),text.c_str());
    gtk_editable_set_text(GTK_EDITABLE(entry2), text.c_str());


    cout <<  "after change: " << endl;

    ReadsSizes();
}


static void appActivate (GApplication *app, gpointer user_data) {
    GtkWidget *win = gtk_application_window_new (GTK_APPLICATION (app));
    gtk_window_set_title (GTK_WINDOW (win), "Title");
    gtk_window_set_default_size (GTK_WINDOW (win), 400, 300);

    GtkWidget  *vBox = gtk_box_new (GTK_ORIENTATION_VERTICAL,10);

    gtk_window_set_child (GTK_WINDOW (win), vBox);

    GtkWidget *labText = gtk_label_new("label");
    gtk_box_append (GTK_BOX (vBox), labText);

    GtkWidget *btnSizeLab = gtk_button_new_with_label("change size labels from entry1");
    gtk_box_append  (GTK_BOX (vBox), btnSizeLab);
    g_signal_connect_swapped(GTK_BUTTON(btnSizeLab), "clicked", G_CALLBACK(ChangeSizeLab), win);

    GtkWidget *btnSizeBtn = gtk_button_new_with_label("change size bttons  from entry1");
    gtk_box_append  (GTK_BOX (vBox), btnSizeBtn);
    g_signal_connect_swapped(GTK_BUTTON(btnSizeBtn), "clicked", G_CALLBACK(ChangeSizeBtn), win);

    GtkWidget *btnSizeEnt = gtk_button_new_with_label("change size entrys  from entry1");
    gtk_box_append  (GTK_BOX (vBox), btnSizeEnt);
    g_signal_connect_swapped(GTK_BUTTON(btnSizeEnt), "clicked", G_CALLBACK(ChangeSizeEnt), win);

    GtkWidget *btnReadSize = gtk_button_new_with_label("read sizes widgets");
    gtk_box_append  (GTK_BOX (vBox), btnReadSize);
    g_signal_connect_swapped(GTK_BUTTON(btnReadSize), "clicked", G_CALLBACK(ReadsSizes), win);

    GtkWidget *btnSetSizeFrom = gtk_button_new_with_label("set all sizes widgets  from entry1");
    gtk_box_append  (GTK_BOX (vBox), btnSetSizeFrom);
    g_signal_connect_swapped(GTK_BUTTON(btnSetSizeFrom), "clicked", G_CALLBACK(ChangeSizeFromEnt), win);

    GtkWidget *btnZmen = gtk_button_new_with_label("change texts");
    gtk_box_append  (GTK_BOX (vBox), btnZmen);
    g_signal_connect_swapped(GTK_BUTTON(btnZmen), "clicked", G_CALLBACK(ChangeTexts), win);

    GtkWidget *btnBack = gtk_button_new_with_label("Close");
    gtk_box_append  (GTK_BOX (vBox), btnBack);
    g_signal_connect_swapped(GTK_BUTTON(btnBack), "clicked", G_CALLBACK(gtk_window_destroy), win);

    gtk_widget_set_visible(win, true);

    GtkWidget *windowDetail = gtk_window_new ();

    GtkWidget *lBox = gtk_list_box_new();
    gtk_window_set_child (GTK_WINDOW (windowDetail), lBox);

    GtkWidget  *hBox1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL,10);
    gtk_list_box_append(GTK_LIST_BOX(lBox),  hBox1);

    GtkWidget  *hBox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL,10);
    gtk_list_box_append(GTK_LIST_BOX(lBox),  hBox2);

    GtkWidget  *hBox3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL,10);
    gtk_list_box_append(GTK_LIST_BOX(lBox),  hBox3);


    btn = gtk_button_new_with_label("initial text");
    gtk_box_append (GTK_BOX (hBox1), btn);

    lab = gtk_label_new("initial text");
    gtk_box_append (GTK_BOX (hBox2), lab);

    entry = gtk_entry_new();
    gtk_editable_set_text(GTK_EDITABLE(entry), "initial text");
    gtk_box_append (GTK_BOX (hBox3), entry);

    btn2 = gtk_button_new_with_label("initial text");
    gtk_box_append (GTK_BOX (hBox1), btn2);

    lab2 = gtk_label_new("initial text");
    gtk_box_append (GTK_BOX (hBox2), lab2);

    entry2 = gtk_entry_new();
    gtk_editable_set_text(GTK_EDITABLE(entry), "initial text");
    gtk_box_append (GTK_BOX (hBox3), entry2);

    gtk_widget_set_visible(windowDetail, true);
}


int main(int argc, char **argv) {
    GtkApplication *app;
    app = gtk_application_new ("testing.app", G_APPLICATION_FLAGS_NONE);
    g_signal_connect (app, "activate", G_CALLBACK (appActivate), NULL);
    return g_application_run (G_APPLICATION (app), NULL, NULL);
    g_object_unref (app);

    return 0;
}

I think what you are looking for is either GtkGrid or GtkSizeGroup.

3 Likes

Great! gtkSizeGroup helps.
Thank you a lot

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.