8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

gtk_widget_set_size_request() 未按预期运行

Satyajay Prabhakar 2月前

80 0

我创建了一个带有 3 个子项、一个标签和 2 个按钮的 action_bar 小部件。我在 gtk_widget_set_size_request() 方法中尝试了多种宽度和高度尺寸。无论我设置的尺寸是多少...

我创建了一个带有 3 个子项、一个标签和 2 个按钮的 action_bar 小部件。我在该方法中尝试了多种宽度和高度尺寸 gtk_widget_set_size_request() 。无论我将操作栏的尺寸设置为多少,无论窗口本身的大小如何,操作栏的高度始终相同。

这是我为整个项目编写的代码。很抱歉,所有代码都挤在一起了。我遇到了一些复制和粘贴问题...

#include <gtk/gtk.h>
#include <pango/pango.h>
#include <stdio.h>
//READERS! This code is meant to be easily read for people who want to learn!
//Handles initializing the window
static void activateWindow(GtkApplication *app) {
        GtkWidget *window = gtk_application_window_new(app);
        //TopActionBar | Creation
        GtkWidget *topActionBar = gtk_action_bar_new();
        //This line is the issue.
        gtk_widget_set_size_request(GTK_WIDGET(topActionBar), -1, 17);
        //TopActionBar | TITLE
                GtkWidget *bideLabel = gtk_label_new(NULL);
                gchar *bideLabelText = g_markup_printf_escaped("<b>BIDE</b>");
                gtk_label_set_markup(GTK_LABEL(bideLabel), bideLabelText);
                gtk_action_bar_pack_start(GTK_ACTION_BAR(topActionBar), GTK_WIDGET(bideLabel));
                //TopActionBar | Open Folder Button
                GtkWidget *openFolder = gtk_button_new();
                gtk_button_set_label(GTK_BUTTON(openFolder), "Open Folder");
                gtk_action_bar_pack_start(GTK_ACTION_BAR(topActionBar), GTK_WIDGET(openFolder));
                //TopActionBar | Help Menu Button
                gchar *helpButtonText = g_markup_printf_escaped("<u>HELP</u>");
                GtkWidget *helpButton = gtk_button_new();
                GtkWidget *helpLabel = gtk_label_new("Help");
                gtk_label_set_markup(GTK_LABEL(helpLabel), helpButtonText);
                gtk_button_set_child(GTK_BUTTON(helpButton), GTK_WIDGET(helpLabel));
                gtk_action_bar_pack_start(GTK_ACTION_BAR(topActionBar), GTK_WIDGET(helpButton));
        gtk_window_set_child(GTK_WINDOW(window), GTK_WIDGET(topActionBar));
        gtk_window_present(GTK_WINDOW(window));

}
int main(int argc, char *argv[]){
        GtkApplication *app = gtk_application_new("me.lufthor.bide", G_APPLICATION_DEFAULT_FLAGS);
        g_signal_connect(app, "activate", G_CALLBACK(activateWindow), NULL);
        return g_application_run(G_APPLICATION(app), argc, argv);

}

我尝试调整高度和宽度值,但没有任何变化。

帖子版权声明 1、本帖标题:gtk_widget_set_size_request() 未按预期运行
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Satyajay Prabhakar在本站《c》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我刚刚学习了 C 中的流缓冲。据我所知,C 中的 printf() 是缓冲的,只有当遇到新行、缓冲区已满或我们手动刷新 stdout 时才会打印。然后我尝试

    我刚刚学习了 C 中的流缓冲。据我所知, printf() C 中的流缓冲是缓冲的,只有当它遇到新行、缓冲区已满或我们 stdout 手动刷新时才会打印。然后我尝试了以下几行代码:

    #include <stdio.h>
    
    int main() {
        printf("Hello world");
        while(1);
    }
    

    理论上,控制台不会收到任何内容,因为 Hello world 仍在缓冲区中。但由于某些原因,我的控制台仍然显示此字符串。为什么会这样?

    编辑 :我正在使用 Windows 10 中的命令提示符。

  • 此答案中的链接是引用它的文档。微软的意思是,每次调用 printf()(库调用)时,本质上都是写入“字符设备”,即控制台 (stdout),都会立即刷新,即显示在终端上。所以您看到的内容与文档相符。

  • @DavidRanieri — 是的,这解释了为什么在 Windows 上工作的人认为输出末尾的换行符不是必要的。

  • @DavidGrayson 很好的引用,但是 while(1); 看起来不像是“库调用”,这是否意味着每次调用 printf 时都会有一个隐式的 fflush?

  • 我不确定您正在阅读 C 标准的哪一部分,但根据 Microsoft 的 C 运行时库 文档

    使用流例程打开的文件默认是缓冲的。stdout 和 stderr 函数在已满时会被刷新,或者, 如果你正在写入字符设备,则在每次调用库之后刷新 .

    该文档还链接到 Microsoft 特定的 setvbuf 函数,您可以根据需要使用该函数来控制缓冲。我通常只让运行时库使用其默认设置,然后 fflush(stdout) 在每个我想要确保输出被刷新的地方显式调用。

  • printf() 在 C 中,它被缓冲,并且只有当遇到新行时才会打印

    不完全的。

    流通常有以下三种模式: 无缓冲 , 全缓冲 , 行缓冲 。通常 stdout 行缓冲的 ,当打印 时刷新数据 '\n' ,其内部缓冲区已满或由于显式命令,例如 fflush(stdout) .

    然而 C 对这 3 种模式有具体说明: 对这些特性的支持是由实现定义的 。C17dr § 7.21.3 3.

    因此,看到输出和看不到输出都符合 OP 的代码。

    为了确保输出可见,请刷新。否则,请遵循实现定义的行为。

    printf("Hello world");
    fflush(stdout); // add
    while(1);
    
  • 正确,我应该说“使用 gcc”而不是“在 Linux 上”,这就像使用品牌名称而不是产品一样,只是习惯而已(gcc 在 Linux 上很常见,而 Microsoft 编译器在 Windows 上很常见)。@NguyễnTùngDương 互联网上有很多相互矛盾或不完整的信息,这就是为什么我想知道官方标准对此有何规定,既然你问了这个问题,最好能添加它。似乎 chux 的回答说它依赖于实现,这正是我所怀疑的。

  • @RyanZhang 提供的链接回答了“为什么应用程序退出时会刷新缓冲区”:“当同一设备上即将发生输入时,必须刷新缓冲区”或“当相关文件关闭时,缓冲区也会刷新”。但似乎在 OP 的示例中,在没有输入的情况下,应用程序退出之前会打印换行符。

  • 我在 Debian Linux 中测试了您的程序,根本没有看到任何输出。在使用 MinTTY 的 MSYS2(Windows)中,我只有在使用 Ctrl+C 终止程序后才看到输出。您在哪里测试这个程序?有时刷新行为取决于标准输出是连接到终端还是文件。

  • 我试过了,结果是一样的。我对每个元素都使用了 gtk_widget_set_size_request(),大小是一样的。

  • 您正在尝试为操作栏设置大小。虽然从技术上讲它是一个小部件,但它首先是一个容器。作为容器,它本身没有大小。操作栏大小是根据它所属的容器(应用程序窗口)和容器内的小部件(按钮)计算得出的。

    因此,如果您想看到尺寸差异 action_bar - 您可以更改其中按钮的尺寸。只需增大(或缩小)按钮 - 操作栏应自动适应它。

    但是此代码还存在“外部”问题。您的 action bar 是窗口的唯一子项。因此,无论您为按钮定义什么大小 - 您都不会看到它,因为在这种情况下,操作栏将增长到窗口的内部高度。要查看 的不同大小 action bar ,我们需要 action bar 和其他东西。 action bar 总是自动水平增长,但具有固定的高度(这取决于栏内的按钮)。因此,我们需要在操作栏下方有另一个小部件,具有垂直自动调整大小的功能,以便操作栏可以保留其手动定义的高度。

    因此,在您的代码中,不要只写一行:

    gtk_window_set_child(GTK_WINDOW(window), GTK_WIDGET(topActionBar));
    

    你需要这样做:

          // The box is a layout container which holds other widgets
          GtkWidget *box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
          // The child of a window must be a top layout widget 
          gtk_window_set_child (GTK_WINDOW (window), box);
    
          // Almost any widget is good for this example.
          // The scrolled window is good enough.
          GtkWidget *sw = gtk_scrolled_window_new ();
          gtk_widget_set_vexpand (sw, TRUE);
    
          // Now add both widgets into the layout container
          gtk_box_append (GTK_BOX (box), topActionBar);
          gtk_box_append (GTK_BOX (box), sw);
    
          // and the next line will do what you want
          gtk_widget_set_size_request(GTK_WIDGET(helpLabel), -1, 200);
    
返回
作者最近主题: