【问题标题】:dialog (shell script program) but for C/C++ programs对话框(shell 脚本程序),但用于 C/C++ 程序
【发布时间】:2012-07-07 09:16:11
【问题描述】:

我正在寻找一个库或可从 C/C++ 使用的东西(如果可能,跨平台),它执行类似于程序“对话框”的功能,该程序在大多数 Linux 系统上都可用。基本上,我想要一个类似于dialog --menu 的简单菜单,但我不想为此编写太多代码。基于控制台的很好;有人知道这样的图书馆吗?

顺便说一句,有没有人知道搜索程序“对话框”而不是 GUI 对话框(例如 Go 编程语言的“golang”)的良好 Google 快捷方式?我无法让“对话”产生有用的结果。

谢谢!

【问题讨论】:

    标签: c++ dialog console terminal


    【解决方案1】:

    dialog 实际上带有一个库。它在手册页中提到。

    如果您使用以下内容,它将向您显示有关如何使用该库的信息。它是一个静态库,它有一个dialog.h 文件:

    man 3 dialog
    

    Ubuntu 手册页包含一个示例:

    #include <dialog.h>
    
    int main(void)
    {
        int status;
        init_dialog(stdin, stdout);
        status = dialog_yesno(
                     "Hello, in dialog-format",
                     "Hello World!",
                     0, 0);
        end_dialog();
        return status;
    }
    

    要链接,您必须指定 dialogncurses 库,如下所示:

    g++ ... -ldialog -lncurses my-test.cpp -o my-test ...
    

    这里是小部件列表:

    extern int dialog_buildlist(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, int /*list_height*/, int /*item_no*/, char ** /*items*/, int /*order_mode*/);
    extern int dialog_calendar(const char * /*title*/, const char * /*subtitle*/, int /*height*/, int /*width*/, int /*day*/, int /*month*/, int /*year*/);
    extern int dialog_checklist(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, int /*list_height*/, int /*item_no*/, char ** /*items*/, int /*flag*/);
    extern int dialog_dselect(const char * /*title*/, const char * /*path*/, int /*height*/, int /*width*/);
    extern int dialog_editbox(const char * /*title*/, const char * /*file*/, int /*height*/, int /*width*/);
    extern int dialog_form(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, int /*form_height*/, int /*item_no*/, char ** /*items*/);
    extern int dialog_fselect(const char * /*title*/, const char * /*path*/, int /*height*/, int /*width*/);
    extern int dialog_gauge(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, int /*percent*/);
    extern int dialog_helpfile(const char * /*title*/, const char * /*file*/, int /*height*/, int /*width*/);
    extern int dialog_inputbox(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, const char * /*init*/, const int /*password*/);
    extern int dialog_menu(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, int /*menu_height*/, int /*item_no*/, char ** /*items*/);
    extern int dialog_mixedform(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, int /*form_height*/, int /*item_no*/, char ** /*items*/);
    extern int dialog_mixedgauge(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, int /*percent*/, int /*item_no*/, char ** /*items*/);
    extern int dialog_msgbox(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, int /*pauseopt*/);
    extern int dialog_pause(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, int /*seconds*/);
    extern int dialog_prgbox(const char * /*title*/, const char * /*cprompt*/, const char * /*command*/, int /*height*/, int /*width*/, int /*pauseopt*/);
    extern int dialog_progressbox(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/);
    extern int dialog_rangebox(const char * /*title*/, const char * /*file*/, int /*height*/, int /*width*/, int /*min_value*/, int /*max_value*/, int /*default_value*/);
    extern int dialog_tailbox(const char * /*title*/, const char * /*file*/, int /*height*/, int /*width*/, int /*bg_task*/);
    extern int dialog_textbox(const char * /*title*/, const char * /*file*/, int /*height*/, int /*width*/);
    extern int dialog_timebox(const char * /*title*/, const char * /*subtitle*/, int /*height*/, int /*width*/, int /*hour*/, int /*minute*/, int /*second*/);
    extern int dialog_treeview(const char * /*title*/, const char * /*subtitle*/, int /*height*/, int /*width*/, int /*list_height*/, int /*item_no*/, char ** /*items*/, int /*flag*/);
    extern int dialog_yesno(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/);
    

    我们可以看到,其中一个小部件是dialog_menu()

    这里还有一些其他定义,包括dlg_menu()

    extern int dlg_checklist(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, int /*list_height*/, int /*item_no*/, DIALOG_LISTITEM * /*items*/, const char * /*states*/, int /*flag*/, int * /*current_item*/);
    extern int dlg_form(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, int /*form_height*/, int /*item_no*/, DIALOG_FORMITEM * /*items*/, int * /*current_item*/);
    extern int dlg_menu(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, int /*menu_height*/, int /*item_no*/, DIALOG_LISTITEM * /*items*/, int * /*current_item*/, DIALOG_INPUTMENU /*rename_menu*/);
    extern int dlg_progressbox(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, int /*pauseopt*/, FILE * /* fp */);
    

    该手册页为您提供了有关所有这些功能的大量信息。所以值得一读。

    这里是该特定手册页的 FreeBSD 副本的链接:

    https://www.freebsd.org/cgi/man.cgi?query=dialog&sektion=3

    【讨论】:

    • 我正在尝试在 C++ 中使用它,但我找不到任何如何使用它的示例。也许你可以指出我正确的方向。我已经安装了对话框,我可以在 Bash 中使用它,但希望在 C++ 中使用它
    • 我添加了示例。手册页显示了如何编译/链接库。这是一个静态版本,所以很容易。该库附带一个工具,可为您提供标志和库(可能使用pkg-config)。它应该在 C 和 C++ 中工作。据我所知,标题中有一个extern "C",因此您可以按原样包含在 C++ 中。
    • 我在这里也有一个在 C++ 中使用 ncurses 的例子:github.com/m2osw/snapwebsites/blob/master/libsnapwebsites/src/…(上一页查看 .h,尽管 .h 只包含一个指向 impl 的共享指针我>)。不过,它没有使用对话框。这仍然是一个相当高级的 ncurses 示例。
    • 我试图运行你上面的代码的 sn-p。我包括了 dialog.h,但是当我运行它时,我得到了对“init_dialog”的未定义引用,所以我认为我在某处遗漏了一些东西。我正在使用 gcc 编译器。是否应该添加某种开关,例如 -dialog 之类的?
    • 不,没有特殊标志。它直接在/usr/include 中,所以它应该按原样工作。我添加了 #include ... 以防万一您没有将其放入 .cpp 文件中。
    【解决方案2】:

    Yad 是另一个对话框。

    Google this.

    【讨论】:

    • 不知道yad!您是否知道可从非 shell 脚本调用/可用的一种,例如一个 C++ 程序?我知道我可以 exec() 它但我更喜欢实际的头文件和库...
    • 它是开源的,因此您可以调用与命令行解析器相同的功能。但是,如果您想以编程方式创建跨平台对话框,那么 GTK、Wx 或 Qt 更适合。
    【解决方案3】:

    对话框本身基于curses library,这是一个免费分发的GNU project

    附:我通常使用“dialog bash”作为 Google 搜索的关键词。

    【讨论】:

    • 它还提供了自己的库(见我的回答),它位于ncurses 之上的一层。我认为 OP 不想重新设计整个 dialog 功能(好主意!)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 2023-04-07
    • 2018-12-27
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    相关资源
    最近更新 更多