如何修复“ Gtk警告**使用标题栏将内容添加到对话框的操作区域”

时间:2018-12-03 05:33:17

标签: c gtk3 glade

如果我已使用Glade在GtkFileChooserDialog中添加了按钮,则在终端中会收到此警告。

Gtk-WARNING ** Content added to the action area of a dialog using header bars 

即使出现该警告,程序也似乎可以正常运行,但是,我想修复警告。

enter image description here 如何解决此警告?我在做什么错了?

下面的代码是一个按钮的简单GtkWindow。单击按钮后,将打开对话框 有示例代码如何复制此问题:

C代码:

#include <gtk/gtk.h>

//==============================================================Global=variables========================================================================
GtkWidget *FileChooserWindow; //Needed for file open dialog
//==================================Button=stuff==========================
void Button_clicked(GtkWidget* widget, gpointer data)
{
    g_print("Clicked\n");
    gtk_dialog_run (GTK_DIALOG (FileChooserWindow));
}





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


    GtkBuilder      *builder; 
    GtkWidget       *window;

    gtk_init(&argc, &argv);

    builder = gtk_builder_new();
    gtk_builder_add_from_file (builder, "Resources/GUI_design.glade", NULL);

    window = GTK_WIDGET(gtk_builder_get_object(builder, "window_main"));
    gtk_builder_connect_signals(builder, NULL);

    FileChooserWindow = GTK_WIDGET(gtk_builder_get_object(builder, "FileChooserWindow"));
    g_object_unref(builder);

    gtk_widget_show(window);                
    gtk_main();

    return 0;
}




// called when window is closed
void on_window_main_destroy()
{
    gtk_main_quit();
}

刀片设计代码:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkFileChooserDialog" id="FileChooserWindow">
    <property name="can_focus">False</property>
    <property name="type_hint">dialog</property>
    <child internal-child="vbox">
      <object class="GtkBox">
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <property name="spacing">2</property>
        <child internal-child="action_area">
          <object class="GtkButtonBox">
            <property name="can_focus">False</property>
            <property name="layout_style">end</property>
            <child>
              <placeholder/>
            </child>
            <child>
              <object class="GtkButton">
                <property name="label" translatable="yes">Click me</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
              </object>
              <packing>
                <property name="expand">True</property>
                <property name="fill">True</property>
                <property name="position">1</property>
              </packing>
            </child>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">False</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <placeholder/>
        </child>
      </object>
    </child>
  </object>
  <object class="GtkWindow" id="window_main">
    <property name="can_focus">False</property>
    <property name="default_width">500</property>
    <property name="default_height">500</property>
    <property name="icon">icon.png</property>
    <signal name="destroy" handler="on_window_main_destroy" swapped="no"/>
    <child type="titlebar">
      <placeholder/>
    </child>
    <child>
      <object class="GtkButton" id="TestButton">
        <property name="label" translatable="yes">button</property>
        <property name="visible">True</property>
        <property name="can_focus">True</property>
        <property name="receives_default">True</property>
        <signal name="clicked" handler="Button_clicked" swapped="no"/>
      </object>
    </child>
  </object>
</interface>

2 个答案:

答案 0 :(得分:0)

首先,这不是错误,您的对话框不会崩溃。

GtkDialogs可以使用或不使用GtkHeaderBars。您可以通过检查"use-header-bar"属性来以编程方式检查它。如果它是TRUE,则应该get_header_bar并在此处打包按钮。

我不知道如何用Glade做到这一点。我建议您使用不同的装饰复选框或手动编写代码。

答案 1 :(得分:0)

  

Bumbieris112:“如何添加“ use-header-bar”属性?”

很好地指向文档(https://developer.gnome.org/gtk3/stable/GtkDialog.html#GtkDialog.properties),这样的调用就足够了:

g_object_set( dialog, "use-header-bar", 1, NULL );

可惜不是这样的

(Dialog:2943): GLib-GObject-WARNING **: 23:57:00.433: g_object_set_is_valid_property: construct property "use-header-bar" for object 'GtkDialog' can't be set after construction

换句话说,基于此警告,一旦调用gtk_dialog_new(),就无法再设置此属性了。

这意味着有两种可能的方法可以解决此类问题。

  • 1)

创建带有按钮的对话框

dialog = gtk_dialog_new_with_buttons( "response",
                                       window,
                                       GTK_DIALOG_USE_HEADER_BAR, /// Use this FLAG here
                                       "Yes", 1,
                                       "No", 2,
                                       "Cancel", 3,
                                       NULL );
  • 2)

    您需要自己创建:

    dialog = g_object_new ( GTK_TYPE_DIALOG,
               "transient-for", window,
               "use-header-bar", -1, /// Or 1 to not set it
               NULL );
    

如果您需要在构建过程中检查其默认设置,请执行以下操作:

gint use_header;
g_object_get ( gtk_settings_get_default (), "gtk-dialogs-use-header", &use_header, NULL );
g_print ( "use_header = %d\n", use_header );

您将看到返回0:

  

use_header = 0

这绝对不是手册所说的:

  

标志:仅读/写/构造允许值:[-1,1]默认   值:-1

因此请记住,只有-11是有效值。