销毁gtkmm消息对话框?

4
我正在使用gtkmm 3.0.1,创建Gtk::MessageDialog时没有看到一个选项来在用户单击按钮后销毁对话框。我发现唯一的方法是在一个次要函数中调用它来销毁消息对话框,但我感觉这是可以避免的可能性。文档没有提及任何销毁它的方法,只提到由用户来负责销毁。
以下是我的代码:
#include <gtkmm.h>
#include <iostream>

using namespace std;

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

    Gtk::Main kit(argc, argv);
    Gtk::Window client;

    Gtk::MessageDialog dialog("Info", false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO);
    dialog.set_secondary_text( "Dialog");
    dialog.set_default_response(Gtk::RESPONSE_YES);
    dialog.run();

    cout << "dialog is still open, needs to be destroyed at this point." << endl;

    Gtk::Main::run(client);

    return EXIT_SUCCESS;

}

我猜测:由于没有调用 Gtk::Main::run(client),所以对话框无法接收事件。 - user2249683
“你是什么意思?” Gtk::Main::run(client); 是倒数第二个命令。 - cellsheet
...在 Gtk::MessageDialog 之后 - user2249683
这只是在用户退出主窗口后才使对话框出现的代码。 - cellsheet
1个回答

7
问题在于你在int main中创建了一个堆栈上的Gtk::MessageDialog。由于该函数直到程序退出时才会退出,因此你的MessageDialog会一直存在。

几个选择:

1.) 使用隐藏对话框,完成后它将在int main退出时被销毁。

2.) 新创建,然后删除它。

Gtk::MessageDialog* dialog = new Gtk::MessageDialog("Info", false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO);
dialog->set_secondary_text( "Dialog");
dialog->set_default_response(Gtk::RESPONSE_YES);
dialog->run();
delete dialog;    

3.) 把它放在自己的函数或块中,这样当该作用域结束时,它将被销毁。

void showDialog() {
    Gtk::MessageDialog dialog("Info", false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO);
    dialog.set_secondary_text( "Dialog");
    dialog.set_default_response(Gtk::RESPONSE_YES);
    dialog.run();
}

int main(int argc, char *argv[]) {
    etc...
    showDialog();
    Gtk::Main::run(client);
    etc...
}

我注意到文档中有一行代码 virtual Gtk::MessageDialog::~MessageDialog() [virtual],但我不太确定如何使用它,是否这是用于析构对话框类的方法。 - cellsheet
实际上,我只需使用 dialog.~MessageDialog(); 就能摧毁它。 - cellsheet
2
小心使用这种方法。虽然它可能有效,但在局部变量上手动调用析构函数可能会引起麻烦:http://www.parashift.com/c++-faq/dont-call-dtor-on-local.html。 - Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接