如何在Gtk对话框中询问用户的内容?

时间:2013-10-06 09:46:32

标签: dialog gtk message vala

我最近开始使用Vala编程语言开发Gtk + 3.x.我过去常常使用C#和visual studio完成相同的任务,但后来转移到了Linux。

如何在对话框中询问简单的确定/取消问题?在C#中,MessageBox.Show()非常简单。然而,Gtk似乎很烦人,我所做的每一次Google搜索都让我对Dialogs和事件处理程序产生了技术性的喋喋不休。

是否只有一个简单的功能,所以我可以这样做:

bool result = MessageBox.AskQuestion("Do you want to save?");

谢谢,

巴里史密斯

2 个答案:

答案 0 :(得分:4)

实际上,通过反复试验找到了它......

public bool show_question(string message, Gtk.Window window, MessageType mt)
{
    Gtk.MessageDialog m = new Gtk.MessageDialog(window, DialogFlags.MODAL, mt, ButtonsType.OK_CANCEL, message);
    Gtk.ResponseType result = (ResponseType)m.run ();
    m.close ();
    if (result == Gtk.ResponseType.OK)
    {
        return true;
    }
    else
    {
        return false;
    }
}

答案 1 :(得分:3)

略有改进的版本:

public bool show_question(string primary_markup,
                          string? secondary_markup = null,
                          Gtk.Window? parent = null,
                          Gtk.MessageType message_type = Gtk.MessageType.QUESTION)
{
    var m = new Gtk.MessageDialog.with_markup(parent,
                                              Gtk.DialogFlags.MODAL,
                                              message_type,
                                              Gtk.ButtonsType.OK_CANCEL,
                                              primary_markup);
    m.format_secondary_markup(secondary_markup);
    var result = (Gtk.ResponseType) m.run();
    m.destroy();
    return (result == Gtk.ResponseType.OK);
}

这个新版本利用了Vala的默认参数,因此在最简单的情况下,您只需调用show_question("Is this OK?");即可。此外,您现在还可以使用Pango Markup生成更好看的对话框,例如:

show_question("<b><big>Overwrite File?</big></b>",
              "<small>The file <i>\"%s\"</i> will be overwritten if you proceed</small>".printf(my_filename),
              parent_window,
              Gtk.MessageType.WARNING);

值得注意的是,在GTK中,使用普通的“OK / CANCEL”响应通常不赞成。相反,建议使用包含与所讨论的动作有关的动词的按钮标签;所以在上面的例子中,“取消”和“覆盖”将是更好的选择(默认为取消,当然)。这对程序员来说需要一点点但更多的工作,但提供了更好的用户体验。