K
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();
}