gtkmm calendar



  • ich wollte aus meiner GUI (MainWindow) heraus per Button_click ein Window
    mit Calendar Widget öffnen. Das klappt ! Dann das Datum ändern klappt auch.
    Aber die Rückmeldung des geänderten Datums an das MainWindow funktioniert erst,
    wenn ich das Window mit dem Calendar Widget erneut aufrufe.

    Hat hier jemand einen Tip für mich, wie man ein update im MainWindow hinbekommt, während das Window mit Calendar Widget noch geöffnet und aktiv ist ?



  • robertoli schrieb:

    ich wollte aus meiner GUI (MainWindow) heraus per Button_click ein Window
    mit Calendar Widget öffnen. Das klappt ! Dann das Datum ändern klappt auch.
    Aber die Rückmeldung des geänderten Datums an das MainWindow funktioniert erst,
    wenn ich das Window mit dem Calendar Widget erneut aufrufe.

    Hat hier jemand einen Tip für mich, wie man ein update im MainWindow hinbekommt, während das Window mit Calendar Widget noch geöffnet und aktiv ist ?

    Also ohne Code kann man wenig sagen, aber probier mal folgendes:

    Implementier den on_day_selected event handler. Der wird aufgerufen, wenn der Benutzer auf 'nen Tag geklickt hat. In diesem event-handler kannst du nun das Main-Window darüber informieren, dass es die geänderten Daten übernehmen soll.

    Dazu musst du noch eine öffentliche Methode anbieten, damit das "zurückschreiben" der Daten vom Kalenderdialog in das MainWindow klapt. Oder von mir aus mach den Kalenderdialog zum Freund von MainWindow (wobei das nicht so sexy ist).

    Cheers

    GPC



  • hier ist mal ein Stück code -- so funktioniert es natürlich nicht.
    wenn ich eine neue Instanz vom Calex Window öffne, dann funktioniert es,
    aber es ist eben ein 2. Hauptfenster geöffnet.

    #ifndef GTKMM_MYCALENDAR_H
    #define GTKMM_MYCALENDAR_H
    
    #include <gtkmm.h>
    
    class myCalendar : public Gtk::Window
    {
    public:
       myCalendar();
       virtual ~myCalendar();
    
      	Gtk::Calendar m_Calendar; 
    	Glib::Date get_date() const;
    
    private:
    	virtual	void on_my_day_selected_double_click();
    };
    #endif //GTKMM_MYCALENDAR_H
    
    /* Calendar Widget in a Window                        */
    
    #include "myCalendar.h"
    #include "calex.h"
    #include <iostream>
    
    myCalendar::myCalendar()
    {
    	add(m_Calendar);
    
    // Signals
    m_Calendar.signal_day_selected_double_click().connect(sigc::mem_fun(*this,
    	&myCalendar::on_my_day_selected_double_click) );
    
     show_all_children();
    }
    myCalendar::~myCalendar()
    {
    }
    
    void myCalendar::on_my_day_selected_double_click()
    {
    	Calex::Calex myDWD;
    	Glib::ustring strDatum(get_date().format_string("%x"));
    	std::cout << strDatum << "vom Kalender gesendet" << std::endl;
    	myDWD.Datum_ermitteln(strDatum);
    }
    Glib::Date myCalendar::get_date() const
    
    {
      using Glib::Date;
      unsigned int year = 0, month = 0, day = 0;
      m_Calendar.get_date(year, month, day);
      return Date(Date::Day(day), Date::Month(Date::JANUARY + month),   Date::Year(year));
    
    }
    
    #ifndef GTKMM_CALEX_H
    #define GTKMM_CALEX_H
    
    #include "myCalendar.h"
    #include <gtkmm.h>
    #include <stdio.h>
    
    class Calex : public Gtk::Window
    {
    public:
       Calex();
       virtual ~Calex();
    	Gtk::Label	m_lblDatum;
    	void Datum_ermitteln(Glib::ustring);
    
    private:
    	Gtk::Button		m_btnDatum;
    	Gtk::VBox		m_VBox;
    	myCalendar m_CalexCalendar;
    	virtual void on_btnDatum_clicked (void);
    
    };
    #endif //GTKMM_CALEX_H
    
    /* Main Window                        */
    
    #include "calex.h"
    #include <iostream>
    
    Calex::Calex()
    {
       set_title ("title");
       set_border_width(10);
       set_default_size(1024, 768);
    
    	m_lblDatum.set_text("not yet data");
    	m_btnDatum.set_label("Datum");
    
    	m_VBox.pack_start(m_lblDatum,Gtk::PACK_SHRINK);
    	m_VBox.pack_end(m_btnDatum,Gtk::PACK_SHRINK);
    
    	add(m_VBox);
    
    // Signals
    
    	m_btnDatum.signal_clicked().connect(sigc::mem_fun(*this,
                  &Calex::on_btnDatum_clicked) );
    
      show_all_children();
    }
    Calex::~Calex()
    {
    }
    
    void Calex::Datum_ermitteln(Glib::ustring strDatumUp)
    {
    	m_lblDatum.set_text(strDatumUp);
    	std::cout << strDatumUp << "vom Main empfangen" << std::endl;
    }
    
    void Calex::on_btnDatum_clicked()
    {
    
    	while (!m_CalexCalendar.is_visible() )
    
    	{
    		m_CalexCalendar.show();
    	}
    }
    
    #include <gtkmm/main.h>
    #include "calex.h"
    int main(int argc, char *argv[])
    {
       Gtk::Main kit(argc, argv);
       Calex window;
       //Shows the window and returns when it is closed.
       Gtk::Main::run(window);
       return 0;
    }
    


  • Klar, du musst natürlich das "erste Hauptfenster" benutzen 😉 Das machst du, indem du ein paar Sachen veränderst...

    Ach ja, die Headerdateien hab ich umbenannt... musst du eben wieder rückgängig machen.

    myCalendar.hpp

    #ifndef GTKMM_MYCALENDAR_H
    #define GTKMM_MYCALENDAR_H
    
    #include <gtkmm.h>
    
    class myCalendar : public Gtk::Window
    {
    public:
       myCalendar(class Calex*);
       virtual ~myCalendar();
    
          Gtk::Calendar m_Calendar;
        Glib::Date get_date() const;
    
    private:
        virtual    void on_my_day_selected_double_click();
        class Calex *calex;         //NEU
    };
    #endif //GTKMM_MYCALENDAR_H
    

    myCalendar.cpp

    #include "myCalendar.hpp"
    #include "calex.hpp"
    #include <iostream>
    
    myCalendar::myCalendar(class Calex *c) : calex(c)   //GEAENDERT
    {
        add(m_Calendar);
    
    // Signals
    m_Calendar.signal_day_selected_double_click().connect(sigc::mem_fun(*this,
        &myCalendar::on_my_day_selected_double_click) );
    
     show_all_children();
    }
    myCalendar::~myCalendar()
    {
    }
    
    void myCalendar::on_my_day_selected_double_click()
    {
        Glib::ustring strDatum(get_date().format_string("%x"));
        std::cout << strDatum << "vom Kalender gesendet" << std::endl;
        calex->Datum_ermitteln(strDatum);    //NEU
    }
    Glib::Date myCalendar::get_date() const
    
    {
      using Glib::Date;
      unsigned int year = 0, month = 0, day = 0;
      m_Calendar.get_date(year, month, day);
      return Date(Date::Day(day), Date::Month(Date::JANUARY + month),   Date::Year(year));
    
    }
    

    calex.hpp

    #ifndef GTKMM_CALEX_H
    #define GTKMM_CALEX_H
    
    #include "myCalendar.hpp"
    #include <gtkmm.h>
    #include <stdio.h>
    
    class Calex : public Gtk::Window
    {
    public:
       Calex();
       virtual ~Calex();
        Gtk::Label    m_lblDatum;
        void Datum_ermitteln(Glib::ustring);
    
    private:
        Gtk::Button        m_btnDatum;
        Gtk::VBox        m_VBox;
        myCalendar *m_CalexCalendar;    //GEANDERT
        virtual void on_btnDatum_clicked (void);
    
    };
    #endif //GTKMM_CALEX_H
    

    calex.cpp

    #include "calex.hpp"
    #include <iostream>
    
    Calex::Calex()
    {
       set_title ("title");
       set_border_width(10);
       set_default_size(1024, 768);
    
        m_lblDatum.set_text("not yet data");
        m_btnDatum.set_label("Datum");
    
        m_VBox.pack_start(m_lblDatum,Gtk::PACK_SHRINK);
        m_VBox.pack_end(m_btnDatum,Gtk::PACK_SHRINK);
    
        add(m_VBox);
    
        m_CalexCalendar = new myCalendar(this);        //NEU
    
    // Signals
    
        m_btnDatum.signal_clicked().connect(sigc::mem_fun(*this,
                  &Calex::on_btnDatum_clicked) );
    
      show_all_children();
    }
    Calex::~Calex()
    {
      delete m_CalexCalendar;
    }
    
    void Calex::Datum_ermitteln(Glib::ustring strDatumUp)
    {
        m_lblDatum.set_text(strDatumUp);
        std::cout << strDatumUp << "vom Main empfangen" << std::endl;
    }
    
    void Calex::on_btnDatum_clicked()
    {   
        while (!m_CalexCalendar->is_visible() )         //GEAENDERT
    
        {
            m_CalexCalendar->show();                    //GEAENDERT
        }
    }
    

    main.cpp

    #include <gtkmm/main.h>
    #include "calex.hpp"
    int main(int argc, char *argv[])
    {
       Gtk::Main kit(argc, argv);
       Calex window;
       //Shows the window and returns when it is closed.
       Gtk::Main::run(window);
       return 0;
    }
    

    Also das ist jetzt nicht besonders schön und auf const-correctness habe ich auch verzichtet, aber grundsätzlich funzt es eben so, dass du myCalendar einen Zeiger auf das Hauptfensster (Calex) übergibst, damit man aus myCalendar auch dann dieses referenzieren kann. Pretty simple 😉

    Cheers

    GPC



  • hoppla, so einfach - wenn ma's richtig macht.😮
    Danke ! Es funktioniert. 👍


Anmelden zum Antworten