2013-09-01 6 views
3

Я использую gtkmm 3.0.1, и я не вижу возможности при создании объекта Gtk::MessageDialog, чтобы уничтожить диалог после того, как пользователь нажал кнопку. Единственный способ, которым я обнаружил, чтобы уничтожить диалоговое окно сообщения, - это вызвать его во вторичной функции, но я чувствую, что у этого есть возможность избежать. В документации не упоминается ни один способ ее уничтожения, а только упоминается, что пользователь может ее уничтожить.уничтожить диалоговое окно сообщений gtkmm?

Вот мой код:

#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; 

} 
+0

Я предполагаю: поскольку Gtk :: Main :: run (client) не вызывается, диалог не принимает события. –

+0

Что ты имеешь в виду? 'Gtk :: Main :: run (client);' находится от второй до последней команды. – cellsheet

+0

... после Gtk :: MessageDialog –

ответ

5

Проблема вы создали ваш Gtk::MessageDialog в стеке в int main. Поскольку эта функция не будет выходить, пока ваша программа не закроет ваш MessageDialog.

Несколько вариантов:

1.) Hide the dialog когда сделано с ним, он будет уничтожен, когда ИНТ основных выходов.

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... 
} 
+0

Я заметил, что в документации есть строка, которая говорит 'virtual Gtk :: MessageDialog :: ~ MessageDialog() [virtual]', но я не совсем уверен, как ее использовать, если это то, что будет деконструировать класс диалога. – cellsheet

+0

На самом деле я смог уничтожить его, просто используя 'dialog. ~ MessageDialog();'. – cellsheet

+2

Будьте осторожны с этим подходом. Хотя это, вероятно, будет работать, вызов деструктора вручную по локальной переменной может вызвать проблемы: http://www.parashift.com/c++-faq/dont-call-dtor-on-local.html. – Mark

Смежные вопросы