创建独立的gtkmm对话框

时间:2015-12-29 20:58:47

标签: c++ dialog gtkmm

在特定情况下,我需要基于命令行的C ++应用程序来使用gtkmm 2.4启动快速对话框。我真的可以在这里使用一些方向。

我尝试在不初始化顶级窗口的情况下单独启动对话框:

Gtk::Main kit( NULL,NULL );
Gtk::Window toplevel;
MyApp::myDialog d(toplevel);
int result = d.run();

这创建了我的对话框,但是当按下确定或取消按钮时它没有关闭,并且没有退出/删除/隐藏我能找到的api调用可以摆脱它。它只在程序退出时消失(即使它是在先前退出的方法中创建的)。我猜这部分是因为它需要一个活动的主窗口来处理它的一些生命周期/可见性管理。如果我可以让它正常响应ok / cancel按钮,我就会被设置好!

接下来,我尝试正确创建并启动主窗口,并从主窗口的构造函数中启动对话框。 (它需要Gtk :: Main作为参数,所以我可以尝试直接杀死它。)

class cprompt : public Gtk::Window
{
  public:    
    cprompt(Gtk::Main* prompt){
    MyApp::myDialog* d = new MyApp::myDialog (*this);
    std::cout << "ABOUT TO RUN DIALOG" << std::endl;
    int result = d->run();
    std::cout << "RAN DIALOG" << std::endl;
    d->hide();
    delete d;

    std::cout << "CALLING QUIT" << std::endl;
    this->hide();
    Gtk::Main::quit();
    prompt->quit();
    //None of the above calls do anything. The empty 'top level' window hangs around and blocks until manually closed.
    std::cout << "CALLED QUIT" << std::endl;
    };
    virtual                 ~cprompt(){};
};

现在对话框按预期工作,但关闭对话框后出现主窗口(带有退出按钮的空白灰色方块),我无法找到隐藏或退出单击退出按钮的方法。我所做的所有关闭它或自动退出gtk循环的调用都在构造函数中,因此我猜它们在那时无效。如果我可以在窗口构造函数中返回对话框后关闭整个操作,那么我将全部设置完毕。

我的下一个方法是使用顶级窗口本身作为对话框,但我希望避免这种情况,因为我需要的对话框已经由另一个库提供了,我将不得不重新实现ui如果我无法直接启动对话框,请从头开始。

1 个答案:

答案 0 :(得分:0)

与Gtk有同样的问题。要修复它,我需要手动关闭窗口然后执行gtk循环迭代。我的代码看起来像这样(对于filechooser_dialog):

gint result = gtk_dialog_run(GTK_DIALOG(m_fileDialog));

if(result == GTK_RESPONSE_ACCEPT)
{
    char* filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(m_fileDialog));
    m_selectedFileName = std::string(filename);

    g_free(filename);
}

gtk_window_close(GTK_WINDOW(m_fileDialog)); //Close the dialog manually

while (gtk_events_pending()) //until there are no more events :
    gtk_main_iteration_do(false); //process the main iteration