2011-09-07 156 views
0

我遇到以下問題:我創建了一個提示用戶輸入一些信息的程序。這是使用派生Gtk::Dialog,用於像如下進行:gtkmm:窗口內的模態小部件

if (modal_dialog->run() == SUCCESS){ 
    // do stuff depending on modal_dialog inputs here 
} 

現在,我想通過我的主窗口中顯示一個嵌入的小部件來代替對話,但行爲就像我的模態對話框。這意味着我想能夠打電話:

if (modal_widget->run == SUCSESS){ 
    // hide modal widget and do stuff 
} 

在C++/gtkmm中,這很容易嗎?

注:我設法獲得所需的行爲用狀態變量等(感覺爲最終用戶相同的)。這意味着,我手動show崇拜者模態窗口小部件,並在告訴確認按鈕想要通過模式部件來完成例程的其餘部分(上述if -statements的主體)。但是,我使用相同的wannabe-modal小部件來執行不同的操作,所以我一直都會跟蹤自己在做什麼,這不是很優雅。

回答

2

而不是調用run()您可以創建一個本地循環對象並進行嵌套循環。我不知道gtkmm的非常好,但GTK +代碼將是:現在

GMainLoop *loop = g_main_loop_new(NULL, FALSE); 
g_main_loop_run(loop); 
g_main_loop_unref(loop); 

,在clicked事件您確定的/取消按鈕只需調用g_main_loop_quit(loop)和嵌套循環將打破。

其實這或多或少是gtk_dialog_run函數的作用。

但要小心!你的部件run()阻塞但不是模態,這是一個危險的野獸:應用程序中的任何其他小部件仍將對用戶負責。這是由你來避免任何不受歡迎的再入。

+0

聽起來不錯。我會試一試! – phimuemue

+0

是否有可能添加某種結果或返回值? – phimuemue

+0

那麼,你需要'cliked'事件和'run'函數之間的某種共享數據,以獲得循環變量'loop'。只需爲該共享數據添加一個變量,將其設置爲您想返回的值,然後從'run'函數中返回。 – rodrigo