Gibt es in C++ eine einfache Swing ähnliche Bibliothek?



  • JJK3 schrieb:

    Wieso sagt mir mein Buch dann das ich eine eigene Fensterklasse machen soll die von wxFrame erbt?

    Weil das der elegantere Weg ist. Du leitest eine Klasse von wxFrame ab und erweiterst die abgeleitete Klasse um deine Funktionen und behandelst die Ereignisse (Button geklickt...) innerhalb der Klasse, das macht man doch auch bei Java so. Du kannst im Prinzip auch ohne abgeleitete Klasse auskommen, würde ich aber nicht empfehlen.

    wxFrame *frame = new wxFrame(0,-1, _("Hello World"), wxPoint(50, 50), wxSize(450, 340) );
    wxButton *btn = new wxButton( frame, -1, "Click me", wxPoint(10,10), wxSize(80,20) );
    frame->Show(true);
    


  • Ich benutze fltk. Sehr einfach fuer einfache Sachen. Fuer einen Button brauche ich nicht ableiten um auf Klicks zu reagieren. Fuer andere Sachen schon, beispielsweise wenn ich die Art und Weise aendern moechte, die ein Frame/Window/Box sich zeichnet.

    und die machen nicht nur GUI

    Ja, das halte ich fuer problematisch.



  • fltk guck ich mir mal an!

    Du leitest eine Klasse von wxFrame ab und erweiterst die abgeleitete Klasse um deine Funktionen und behandelst die Ereignisse (Button geklickt...) innerhalb der Klasse, das macht man doch auch bei Java so.

    Nein!
    Wenn man einen Button adden möchte macht man:
    frame.add(button);

    Wenn man dem button eine Click Abfrage hinzufügen möchte macht man:
    button.addActionListener(new ...);

    Wie macht man den eine Klick Abfrage bei wxWidgets ohne neue abgeleitete Klasse??



  • JJK3 schrieb:

    Wenn man dem button eine Click Abfrage hinzufügen möchte macht man:
    button.addActionListener(new ...);

    Wie macht man den eine Klick Abfrage bei wxWidgets ohne neue abgeleitete Klasse??

    In wxWidgets wird eine Funktion als Event-Listener gebunden.



  • Bei einem kleinen Programm ist deine Herangehensweise bei Java ok, aber je umfangreicher desto besser ist es auch bei Java/Swing ein Subclassing (extends JFrame) zu machen.

    import javax.swing.JFrame;
    import javax.swing.JLabel;
    
    public class HelloWorldFrame extends JFrame {
    
    	public static void main(String args[]) {
    		new HelloWorldFrame();
    	}
    
    	HelloWorldFrame() {
    		JLabel label = new JLabel("Hello World");
    		add( label  );
    		this.setSize(100, 100);
    		setVisible(true);
    	}
    }
    


  • Softwaremaker schrieb:

    Bei einem kleinen Programm ist deine Herangehensweise bei Java ok, aber je umfangreicher desto besser ist es auch bei Java/Swing ein Subclassing (extends JFrame) zu machen.

    Nein, das sollte man nur machen wenn die eigene Unterklasse auch wirklich neue Funktionen hinzufügt oder es eine kleine in sich geschlossene Application ist(z.B. eine Infobox).
    Sonst ist es sinnlos, umständlich und aufwändig das JFrame in eine neue Klasse zu tun(obwohl es bestimmt irgendwelche Ausnahmen gibt).



  • Youka schrieb:

    JJK3 schrieb:

    Wenn man dem button eine Click Abfrage hinzufügen möchte macht man:
    button.addActionListener(new ...);

    Wie macht man den eine Klick Abfrage bei wxWidgets ohne neue abgeleitete Klasse??

    In wxWidgets wird eine Funktion als Event-Listener gebunden.

    Und wie fügt man jetzt dem Button, konkret und ohne eine neue Fensterklasse zu schreiben, einen Event-Listener auf z.B. onClick hinzu?



  • void MeineApp::MeineApp()
    {
      wxButton *btn = new wxButton( frame, 21, wxT("Click me"), wxPoint(10, 10), wxSize(80, 20) );
      btn->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MeineApp::EventBtnClickMeClicked) );
    }
    
    void MeineApp::EventBtnClickMeClicked(wxCommandEvent& event)
    {
        wxButton *btn = (wxButton*)event.GetEventObject();
        //Mit "btn->GetId()" bekommt man die Id (=21) des Buttons, falls man mehrere Buttons auf diese Ereignisfunktion connected 
        btn->SetLabel("Yes i like it");
    }
    


  • Geht das auch "anonym"?
    Also z.B.:

    int main()
    {
    wxFrame *frame = new wxFrame(0,-1, _("Hello World"), wxPoint(50, 50), wxSize(450, 340) );
    wxButton *btn = new wxButton( frame, -1, "Click me", wxPoint(10,10), wxSize(80,20) );
    frame->Show(true);
      btn->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(
        wxButton *btn = (wxButton*)event.GetEventObject();
        btn->SetLabel("Yes i like it");
    ) );
    }
    


  • In C++11 gibt es Lambda-Funktionen, also namenlose In-Place Funktionen. Noch nicht ausprobiert, klingt aber nach deinem Wunsch.



  • Vielleicht könnt ihr mir ja sagen wie folgender Java Code in wxWidgets aussieht:

    class Test {
        public static void main(String[] args) {
            JFrame frame = new JFrame();
            JButton button = new JButton("Klick mich");
            button.addActionListener(new ActionListener() {
                 @Override
                 public void actionPerformed(ActionEvent e) {
                     button.setText("aua nicht so doll!");
                 }
            });
            frame.add(button);
            frame.setVisible(true);
        }
    }
    

  • Mod

    Denke Qt kommt da am nächsten, hat auch API mäßig einiges in C++ zu bieten, da ja die Standard Library nicht so reichhaltig wie in Java ist (QML, Datenbank, Webkit, Netzwerk, etc.).

    wxWidgets ist auch eine Option, ich weiss nicht ob wxWidgets schon C++11 und Lambdas unterstützt, aber in Qt kannst du einen Slot an ein Lambda binden. Und gerade wegen der C++11 Unterstützung würde ich dir zu Qt oder einer Bibliothek welche schon damit umgehen kann raten.



  • Und wie wûrde mein Java-Code von oben in Qt minimal ausssehen?


  • Mod

    JJK3 schrieb:

    Und wie wûrde mein Java-Code von oben in Qt minimal ausssehen?

    Das wäre wohl:

    QDialog dlg;
    QWidget* frame = new QWidget(&dlg);
    QPushButton* btn = new QPushButton(QString("button"),frame);
    connect(btn,&QPushButton::clicked,[]{QMessageBox::about(0,"Button pressed","Button pressed");});
    dlg.exec();
    

    Auf das Widget könnte man auch verzichten, ist aber so sauberer. Wenn du mehr als 1 Control haben willst im Fenster brauchst du ein Layout.



  • vor allem kommt Qt Java in dem Sinne auch nahe, dass die Subelemente eines Fesnters automatisch gelöscht werden, wenn das Fenster gelöscht wird.
    Feine Sache.

    Insgesamt ist Qt ein enorm mächtiges Framework, vor allem finde ich es eleganter als das wxWidgets, das ist mir zu MFC-like. Qt beinhaltet auch eine sehr gelungene IDE.
    Beachte aber, dass Qt C++ erweitert, es gibt zusätzlich Signals und Slots.

    Am besten du probierst ein paar Frameworks durch, denn was einem am besten gefällt sieht man meist erst, wenn man es selbst ausprobiert.



  • dfsdfs schrieb:

    vor allem kommt Qt Java in dem Sinne auch nahe, dass die Subelemente eines Fesnters automatisch gelöscht werden, wenn das Fenster gelöscht wird.

    Wow ... aeh, wenn ich eine Liste loesche, dann werden auch ihre Knoten geloescht.

    Insgesamt ist Qt ein enorm mächtiges Framework, vor allem finde ich es eleganter ..

    Also du meinst mit dem Metaobjectcompiler, den Macros und dem ganzen Single/Slot-Mechanismus? Nicht zu vergessen von der eigentlichen Groesse der Bibliothek in Funktionalitaet und DLL.


Anmelden zum Antworten