【问题标题】:destroy gtkmm message dialog?销毁 gtkmm 消息对话框?
【发布时间】:2013-09-01 01:07:20
【问题描述】:

我使用的是 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),所以对话框没有接收到事件。
  • 什么意思? Gtk::Main::run(client); 位于倒数第二个命令。
  • ... 在 Gtk::MessageDialog 之后
  • ..这只是让对话框在用户退出主窗口后出现。

标签: c++ messagebox gtkmm


【解决方案1】:

问题是您在int main 的堆栈上创建了您的Gtk::MessageDialog。由于该功能在您的程序执行之前不会退出,因此您的 MessageDialog 会挂起。

几个选项:

1.) Hide the dialog 完成后,它会在 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],但我不太确定如何使用它,如果这样会解构对话框类。
  • 其实我只用dialog.~MessageDialog();就可以销毁它。
  • 谨慎使用这种方法。虽然它可能会起作用,但在局部变量上手动调用析构函数可能会导致麻烦:parashift.com/c++-faq/dont-call-dtor-on-local.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 2023-01-13
  • 2017-08-13
  • 1970-01-01
相关资源
最近更新 更多