about dialog schließen unter gtkmm



  • Hallo zusammen,

    dies ist mein erster Post und seit Kurzem setze ich mich mit C++ auseinander. Mein aktuelles "Übungsprojekt" beinhaltet die GUI-Programmierung mit gtkmm. Soweit so gut.

    Ich habe ein Hauptfenster und einen about dialog. Ich stehe vor folgendem Problem, sobald ich den About Dialog öffne, um ihn dann über das Fensterkreuz zu schließen, schließen sich beide Dialoge, wenngleich sich nur der about dialog schließen sollte. Nun habe ich bereits versucht, mittels der hide()-Funktion dieses Problem zu lösen, allerdings ohne Erfolg. Ferner bin ich mir bei der Verknüpfung des Signals zum Schließen des Dialogs unsicher. Vielleicht kann mir jmd helfen, wie ich obiges Problem lösen kann.

    Als Entwicklungsumgebung nutze ich Anjuta inkl. Glade.

    Vielen Dank KarelZe. 😃

    PS: Sollten euch weitere eklatante Fehler auffallen, teilt sie mir bitte mit, damit ich besser werden kann.

    /
    
    #include <gtkmm.h>
    #include <iostream>
    #include <stdlib.h>
    #include <string>
    #include <iomanip>
    #include<algorithm>
    
    #include "config.h"
    #include "black-scholes.h"
    #include "calc.h"
    
    #ifdef ENABLE_NLS
    #  include <libintl.h>
    #endif
    
    void viewAboutMenu();
    
    /* For testing propose use the local (not installed) ui file */
    /* #define UI_FILE PACKAGE_DATA_DIR"/ui/option_price_calculator.ui" */
    #define UI_FILE "src/option_price_calculator.ui"
    //Load the Glade file and instiate its widgets:
    Glib::RefPtr<Gtk::Builder> builder;
    
    Glib::ustring DoubleToUString(double iVal)
    {
        std::ostringstream ssIn;
        ssIn << iVal;
        Glib::ustring strOut = ssIn.str();
    
        return strOut;
    }
    
    static void on_button_clicked()
    {
    Gtk::Entry* strike = 0;// strike price
    Gtk::Entry* spot = 0;//spot price
    Gtk::Entry* time = 0;// time
    Gtk::Entry* vola = 0;// volatility/sigma
    Gtk::Entry* interest = 0;// risk free interest rate
    
    Gtk::Label* call = 0;
    Gtk::Label* put = 0;
    builder->get_widget("strike", strike);	
    builder->get_widget("spot", spot);
    builder->get_widget("time", time);
    builder->get_widget("vola", vola);
    builder->get_widget("interest", interest);
    
    builder->get_widget("call", call);
    builder ->get_widget("put", put);
    
    //erzeuge ustring
    Glib::ustring num = strike->get_text();
    Glib::ustring num1 = spot->get_text();
    Glib::ustring num2 = time->get_text();
    Glib::ustring num3 = vola->get_text();
    Glib::ustring num5 = interest->get_text();
    
    //dezimal zahlen mit Kommma-Trennung verarbeiten, extrahiere string aus Ustring, ersetze dann, konvertiere zu double
    
    std::string num_str=num.raw();
    std::replace(num_str.begin(),num_str.end(),',','.');	
    
    std::string num_str1=num1.raw();
    std::replace(num_str1.begin(),num_str1.end(),',','.');	
    
    std::string num_str2=num2.raw();
    std::replace(num_str2.begin(),num_str2.end(),',','.');	
    
    std::string num_str3=num3.raw();
    std::replace(num_str3.begin(),num_str3.end(),',','.');	
    
    std::string num_str5=num5.raw();
    std::replace(num_str5.begin(),num_str5.end(),',','.');	
    
    double s = 0, k = 0, r=0, t=0, v=0; 
    
    //string in double
    s = atof(num_str1.c_str());
    k = atof(num_str.c_str());
    r = atof(num_str5.c_str());
    t = atof(num_str2.c_str());
    v = atof(num_str3.c_str());	
    
    double ergebnis1;
    double ergebnis2;
    
    blackScholes rechnung1;
    
    rechnung1.blackS(s, k,r, v, t, ergebnis1, ergebnis2);
    
    //wandle ergebnis in ustring um
    std::stringstream output1;
    output1<<std::fixed<<std::setprecision(3)<<ergebnis1;
    
    std::stringstream output2;
    output2<<std::fixed<<std::setprecision(3)<<ergebnis2;
    
    call->set_text (output1.str());// schreibe call price auf Bildschirm
    put->set_text(output2.str());
    
    }
    //Funktion zum öffnen und schließen des Help Dialogs
    void help_about(GtkWidget *widget){
    gtk_dialog_run(GTK_DIALOG(widget));
    gtk_widget_hide(widget);	
    }
    
    //Link zu Webseite in About-Menü
    void link_click(GtkWidget *widget){
    const gchar*link=gtk_link_button_get_uri(GTK_LINK_BUTTON(widget));
    gchar *lloc=g_strconcat("htmlview", link, NULL);
    system(lloc);
    g_slice_free(gchar, lloc);
    
    }
    
    int main (int argc, char *argv[])
    {
    	Gtk::Main kit(argc, argv);
    
    	g_object_set(gtk_settings_get_default(),
        "gtk-application-prefer-dark-theme", TRUE,
        NULL);
    	try
    	{
    		builder = Gtk::Builder::create_from_file(UI_FILE);
    	}
    	catch (const Glib::FileError & ex)
    	{
    		std::cerr << ex.what() << std::endl;
    		return 1;
    	}
    	Gtk::Window* main_win = 0;
    	builder->get_widget("main_window", main_win);
    
    	if (main_win)
    	{
    	Gtk::Button* pButton = 0;
        builder->get_widget("button1", pButton);
        if(pButton)
        {
          pButton->signal_clicked().connect( sigc::ptr_fun(on_button_clicked) );
    
        }
    
    	Gtk::MenuItem* aboutButton = 0;
        builder->get_widget("help_about", aboutButton);
        if(aboutButton)
        {
    
        aboutButton->signal_select().connect( sigc::ptr_fun(viewAboutMenu) );
    
        }		
    	kit.run(*main_win);
    	}
    
    	return 0;
    }
    
    void viewAboutMenu(){//rufe about Menü auf
    Gtk::AboutDialog *about = 0;
    builder->get_widget("aboutdialog",about);
    about->run();
    }
    

Log in to reply