【问题标题】:Creating a standalone gtkmm dialog创建一个独立的 gtkmm 对话框
【发布时间】:2025-12-02 01:20:05
【问题描述】:

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

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

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

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

接下来,我尝试正确创建和启动主窗口,并从主窗口的构造函数中启动对话框。 (它以 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如果我无法直接启动对话框,请从头开始。

【问题讨论】:

    标签: c++ dialog gtkmm


    【解决方案1】:

    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
    

    【讨论】:

      最近更新 更多