wxWidgets GUI Projekt kompilieren



  • Guten Abend,

    ich versuche mich momentan mit wxWidgets und dem wxFormBuilder vertraut zu machen. Nun bin ich einem Tutorialvideo auf YT gefolgt: http://www.youtube.com/watch?v=id8jQCSRIbo. Das Problem ist, das ich Windows 7 benutze sowie das Makefile welches im Video benutzt wird nicht habe. Ich habe versucht unter Code::Blocks ein leeres wxWidgets Projekt zu erstellen und die Header und Source Dateien hinzuzufügen. Leider bekomme ich beim kompilieren zwei Fehler von der main.cpp:

    main.cpp|5|error: expected class-name before '{' token|
    main.cpp|12|error: expected constructor, destructor, or type conversion before 'bool'|

    //File: main.cpp
    
    #include "wx/wxprec.h"
    #include "mainframe.h" // supplied by the user
    
    class MyApp : public wxApp
    {
    public:
      bool OnInit();
    };
    
    IMPLEMENT_APP( MyApp )
    
    bool MyApp::OnInit()
    {
            MainFrame *frame = new MainFrame(NULL);
    		frame->Show();
    		return true;
    }
    

    Ich nehme an, das ich diese zwei Fehler bekomme, weil keine main.h existiert, aber warum funktioniert das Programm dann im Tutorialvideo?

    Mit freundlichen Grüßen,
    DarkBug

    Edit: Hier ist nochmal ein Downloadlink für alle Dateien.
    http://www.mediafire.com/?9y18x5dql9fm6xz



  • Was steht denn in der Mainframe.h?



  • //File: mainframe.h
    #ifndef __mainframe__
    #define __mainframe__
    
    /**
    @file
    Subclass of GUI_MainFrame, which is generated by wxFormBuilder.
    */
    
    #include "gui.h"
    
    //// end generated include
    
    /** Implementing GUI_MainFrame */
    class MainFrame : public GUI_MainFrame
    {
    	protected:
    		// Handlers for GUI_MainFrame events.
    		void OnCalculateClick( wxCommandEvent& event );
    		void OnExitClick( wxCommandEvent& event );
    	public:
    		/** Constructor */
    		MainFrame( wxWindow* parent );
    	//// end generated class members
    
    };
    
    #endif // __mainframe__
    

    Ich habe aber auch alle Dateien als Downloadlink angehangen.



  • Mit den Quellcode-Schnippseln kann dir wahrscheinlich Keiner helfen.

    Vermutlich fehlt in der main.h erst mal ein #include <wx/wx.h>.
    Dann gehört normalerweise die Klassendefinition MyApp in einen Header und nicht in den Source. Bei #include "wx/wxprec.h" stellt sich die Frage, ob es bei dir überhaupt precompiled header gibt.
    Was macht gui.cpp/h?
    Wie sieht es mit den Compiler Einstellungen aus?

    Vielleicht solltest du das Ganze auch anders angehen. Lade dir die kostenlose Version von phes2011 runter. Da ist ein C++ Editor und ein GUI Designer für wxWidgets bereits vorhanden und du mußt nur noch mit der Maus alles zusammenklicken.
    Link: http://www.philasmicos.de/content/192-phes2011-home_edition ,falls es dich interessiert.
    Ansonsten kann ich dir für den Einstieg in wxWidgets noch das Buch Cross-Platform GUI Programming with wxWidgets (Bruce Perens' Open Source) von Julian Smart, Kevin Hock und Stefan Csomor empfehlen.



  • Ich habe doch alle Dateien als Downloadlink angehangen. Hier nochmal alle Dateien in Textform:

    //File: main.cpp
    #include "wx/wxprec.h"
    #include "mainframe.h" // supplied by the user
    
    class MyApp : public wxApp
    {
    public:
      bool OnInit();
    };
    
    IMPLEMENT_APP( MyApp )
    
    bool MyApp::OnInit()
    {
            MainFrame *frame = new MainFrame(NULL);
    		frame->Show();
    		return true;
    }
    
    //File: mainframe.h
    #ifndef __mainframe__
    #define __mainframe__
    
    /**
    @file
    Subclass of GUI_MainFrame, which is generated by wxFormBuilder.
    */
    
    #include "gui.h"
    
    //// end generated include
    
    /** Implementing GUI_MainFrame */
    class MainFrame : public GUI_MainFrame
    {
    	protected:
    		// Handlers for GUI_MainFrame events.
    		void OnCalculateClick( wxCommandEvent& event );
    		void OnExitClick( wxCommandEvent& event );
    	public:
    		/** Constructor */
    		MainFrame( wxWindow* parent );
    	//// end generated class members
    
    };
    
    #endif // __mainframe__
    
    //File: mainframe.cpp
    #include "mainframe.h"
    
    MainFrame::MainFrame( wxWindow* parent )
    :
    GUI_MainFrame( parent )
    {
    
    }
    
    void MainFrame::OnCalculateClick( wxCommandEvent& event )
    {
      wxArrayString output;
      wxString      command;
    
      m_tcMD5->Clear();
    
      if(m_fpFile->GetPath().IsEmpty())
        return;
    
      command = wxString(wxT("md5sum ")) + m_fpFile->GetPath();
    
      if(wxExecute(command,output) == 0)
        m_tcMD5->SetValue(output[0].BeforeFirst(wxChar(' ')));
    }
    
    void MainFrame::OnExitClick( wxCommandEvent& event )
    {
      Close();
    }
    
    //File: gui.h
    ///////////////////////////////////////////////////////////////////////////
    // C++ code generated with wxFormBuilder (version Jun 30 2011)
    // http://www.wxformbuilder.org/
    //
    // PLEASE DO "NOT" EDIT THIS FILE!
    ///////////////////////////////////////////////////////////////////////////
    
    #ifndef __GUI_H__
    #define __GUI_H__
    
    #include <wx/artprov.h>
    #include <wx/xrc/xmlres.h>
    #include <wx/string.h>
    #include <wx/stattext.h>
    #include <wx/gdicmn.h>
    #include <wx/font.h>
    #include <wx/colour.h>
    #include <wx/settings.h>
    #include <wx/filepicker.h>
    #include <wx/textctrl.h>
    #include <wx/sizer.h>
    #include <wx/statline.h>
    #include <wx/button.h>
    #include <wx/panel.h>
    #include <wx/frame.h>
    
    ///////////////////////////////////////////////////////////////////////////
    
    ///////////////////////////////////////////////////////////////////////////////
    /// Class GUI_MainFrame
    ///////////////////////////////////////////////////////////////////////////////
    class GUI_MainFrame : public wxFrame 
    {
    	private:
    
    	protected:
    		wxPanel* m_panel1;
    		wxStaticText* m_staticText1;
    		wxFilePickerCtrl* m_fpFile;
    		wxStaticText* m_staticText2;
    		wxTextCtrl* m_tcMD5;
    		wxStaticLine* m_staticline1;
    		wxButton* m_button1;
    		wxButton* m_button2;
    
    		// Virtual event handlers, overide them in your derived class
    		virtual void OnCalculateClick( wxCommandEvent& event ) { event.Skip(); }
    		virtual void OnExitClick( wxCommandEvent& event ) { event.Skip(); }
    
    	public:
    
    		GUI_MainFrame( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxT("MD5 Calculator"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 500,300 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
    
    		~GUI_MainFrame();
    
    };
    
    #endif //__GUI_H__
    
    //File: gui.cpp
    ///////////////////////////////////////////////////////////////////////////
    // C++ code generated with wxFormBuilder (version Jun 30 2011)
    // http://www.wxformbuilder.org/
    //
    // PLEASE DO "NOT" EDIT THIS FILE!
    ///////////////////////////////////////////////////////////////////////////
    
    #include "gui.h"
    
    ///////////////////////////////////////////////////////////////////////////
    
    GUI_MainFrame::GUI_MainFrame( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
    {
    	this->SetSizeHints( wxDefaultSize, wxDefaultSize );
    
    	wxBoxSizer* bSizer1;
    	bSizer1 = new wxBoxSizer( wxVERTICAL );
    
    	m_panel1 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
    	wxBoxSizer* bSizer3;
    	bSizer3 = new wxBoxSizer( wxVERTICAL );
    
    	wxFlexGridSizer* fgSizer1;
    	fgSizer1 = new wxFlexGridSizer( 0, 2, 0, 0 );
    	fgSizer1->AddGrowableCol( 1 );
    	fgSizer1->SetFlexibleDirection( wxBOTH );
    	fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
    
    	m_staticText1 = new wxStaticText( m_panel1, wxID_ANY, wxT("Select a File:"), wxDefaultPosition, wxDefaultSize, 0 );
    	m_staticText1->Wrap( -1 );
    	fgSizer1->Add( m_staticText1, 0, wxALL|wxALIGN_RIGHT, 5 );
    
    	m_fpFile = new wxFilePickerCtrl( m_panel1, wxID_ANY, wxEmptyString, wxT("Select a file"), wxT("*.*"), wxDefaultPosition, wxDefaultSize, wxFLP_DEFAULT_STYLE );
    	fgSizer1->Add( m_fpFile, 0, wxALL|wxEXPAND, 5 );
    
    	m_staticText2 = new wxStaticText( m_panel1, wxID_ANY, wxT("MD5:"), wxDefaultPosition, wxDefaultSize, 0 );
    	m_staticText2->Wrap( -1 );
    	fgSizer1->Add( m_staticText2, 0, wxALL|wxALIGN_RIGHT, 5 );
    
    	m_tcMD5 = new wxTextCtrl( m_panel1, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
    	fgSizer1->Add( m_tcMD5, 0, wxALL|wxEXPAND, 5 );
    
    	bSizer3->Add( fgSizer1, 1, wxEXPAND, 5 );
    
    	m_staticline1 = new wxStaticLine( m_panel1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
    	bSizer3->Add( m_staticline1, 0, wxEXPAND | wxALL, 5 );
    
    	wxBoxSizer* bSizer2;
    	bSizer2 = new wxBoxSizer( wxHORIZONTAL );
    
    	m_button1 = new wxButton( m_panel1, wxID_ANY, wxT("&Calculate"), wxDefaultPosition, wxDefaultSize, 0 );
    	bSizer2->Add( m_button1, 0, wxALL, 5 );
    
    	m_button2 = new wxButton( m_panel1, wxID_ANY, wxT("&Exit"), wxDefaultPosition, wxDefaultSize, 0 );
    	bSizer2->Add( m_button2, 0, wxALL, 5 );
    
    	bSizer3->Add( bSizer2, 0, wxALIGN_RIGHT, 5 );
    
    	m_panel1->SetSizer( bSizer3 );
    	m_panel1->Layout();
    	bSizer3->Fit( m_panel1 );
    	bSizer1->Add( m_panel1, 1, wxEXPAND, 5 );
    
    	this->SetSizer( bSizer1 );
    	this->Layout();
    
    	this->Centre( wxBOTH );
    
    	// Connect Events
    	m_button1->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GUI_MainFrame::OnCalculateClick ), NULL, this );
    	m_button2->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GUI_MainFrame::OnExitClick ), NULL, this );
    }
    
    GUI_MainFrame::~GUI_MainFrame()
    {
    	// Disconnect Events
    	m_button1->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GUI_MainFrame::OnCalculateClick ), NULL, this );
    	m_button2->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GUI_MainFrame::OnExitClick ), NULL, this );
    
    }
    

    @kakadu: Nachdem ich

    #include "wx/wxprec.h"
    

    in der main.cpp durch

    #include <wx/wx.h>
    

    ersetzt habe, wird das Programm ohne Fehler kompiliert. Danke für den Tipp. Wenn ich jedoch mit dem Programm eine Datei auswähle und dann auf Calculate klicke, erscheint nur eine Fehlermeldung:

    Execution of command 'md5sum C:\MD5\mainframe.h' failed (error 2: das System kann die angegebene Datei nicht finden.)

    P.S.: Ich habe ja jetzt nur die Dateien aus dem Videotutorial abgeschrieben und deshalb auch keine main.h angelegt. Seltsam das, das Programm im Video funktioniert und bei mir nicht. Korrekt müsste die main.cpp wie folgt aufgeteilt werden, richtig?

    //File: main.h
    #include <wx/wx.h>
    
    class MyApp : public wxApp
    {
    public:
      bool OnInit();
    };
    
    //File: main.cpp
    #include "main.h"
    #include "mainframe.h" // supplied by the user
    
    IMPLEMENT_APP( MyApp )
    
    bool MyApp::OnInit()
    {
            MainFrame *frame = new MainFrame(NULL);
    		frame->Show();
    		return true;
    }
    

    Oder kommt die Zeile

    IMPLEMENT_APP( MyApp )
    

    noch mit in die main.h?



  • In der main.h habe ich immer nach der Klasse noch

    DECLARE_APP(MyApp);
    

    stehen.

    IMPLEMENT_APP(MyApp)
    

    kommt in die main.cpp so wie du es bereits korrekt geschrieben hattest.

    Die Fehlermeldung kommt aus mainframe.cpp Zeile 23. Mach mal eine DOS Konsole auf und tipp einfach mal md5sum ein. Vielleicht hast Du das Programm gar nicht auf deinem Computer. Wenn doch, dann probier den gesamten Befehl aus:

    md5sum C:\MD5\mainframe.h
    

    Bei md5sum ist meistens noch eine Hilfedatei mit allen Parametern dabei. Überprüfe auch, ob die md5sum von deiner Anwendung überhaupt aufgerufen werden kann (Siehe Windows Umgebungsvariable path).

    Von den Tutorialvideos auf YT halte ich persönlich gar nichts. Wenn jemand Wissen vermitteln will, dann soll er eine ordentliche Website aufsetzen und alle Informationen mitliefern, die man zum Nachbauen benötigt. Schritt für Schritt und mit Screenshots, ein Video kann da nur noch für den schnellen Überblick herhalten.



  • Hey wenn du einfach wxWidgets verwenden möchtest, dann empfehle ich dir CodeBlocks zuverwenden, bei der Installation wählst einfach das Plugin wxsmith aus, das ist der GUI-Designer - dieser ist aber etwas schwieriger als der von MS Visual Studio oder von Netbeans (Java).
    Daher empfehle ich dir diese Seite hier http://wiki.codeblocks.org/index.php?title=WxSmith_tutorials
    Ich habe es auch erst heute hinbekommen das alles läuft.
    Wie du dann WxWidgets für CodeBlocks konfigurierst, erfährst du hier http://www.youtube.com/watch?v=D-7VJ1oav1o

    Bei mir klappt's aufjeden Fall endlich. Bin dabei auch schon ein kleines Prog zu schreiben.



  • @Xbody

    Wenn du die Fragen von DarkBug gelesen hättest, dann wüßtest du, dass er bereits C::B verwendet. Sein Problem ist: das Video ist unklar und/oder unvollständig.

    Glaubst du wirklich, dass er was davon hat wenn du ihn jetzt vom wxFormBuilder zu wxSmith schickst und noch ein Tutorialvideo andrehst???
    Außerdem ist der wxFormBuilder wesentlich leistungsfähiger als das wxSmith Plugin.

    Schön dass du dich für wxWidgets begeistert hast. Wenn du DialogBlocks oder PHES ausprobierst, dann wirst du feststellen, dass es auch wesentlich einfacher geht. 😃

    Nebenbei, ich kenne keinen Profi, der C::B verwendet. Sorry!



  • kakadu schrieb:

    @Xbody

    Wenn du die Fragen von DarkBug gelesen hättest, dann wüßtest du, dass er bereits C::B verwendet. Sein Problem ist: das Video ist unklar und/oder unvollständig.

    Glaubst du wirklich, dass er was davon hat wenn du ihn jetzt vom wxFormBuilder zu wxSmith schickst und noch ein Tutorialvideo andrehst???
    Außerdem ist der wxFormBuilder wesentlich leistungsfähiger als das wxSmith Plugin.

    Schön dass du dich für wxWidgets begeistert hast. Wenn du DialogBlocks oder PHES ausprobierst, dann wirst du feststellen, dass es auch wesentlich einfacher geht. 😃

    Nebenbei, ich kenne keinen Profi, der C::B verwendet. Sorry!

    Mag eben kein MS Visual Studio und das andere Zeugs, weil ich unter Linux und Windows schreiben möchte. Gibt's zwar Alternativen, aber Code::Blocks ist das einzige Program, dass unter beiden System sauber läuft.

    Was verwendest den du den so? 😕



  • Xbody schrieb:

    kakadu schrieb:

    @Xbody

    Wenn du die Fragen von DarkBug gelesen hättest, dann wüßtest du, dass er bereits C::B verwendet. Sein Problem ist: das Video ist unklar und/oder unvollständig.

    Glaubst du wirklich, dass er was davon hat wenn du ihn jetzt vom wxFormBuilder zu wxSmith schickst und noch ein Tutorialvideo andrehst???
    Außerdem ist der wxFormBuilder wesentlich leistungsfähiger als das wxSmith Plugin.

    Schön dass du dich für wxWidgets begeistert hast. Wenn du DialogBlocks oder PHES ausprobierst, dann wirst du feststellen, dass es auch wesentlich einfacher geht. 😃

    Nebenbei, ich kenne keinen Profi, der C::B verwendet. Sorry!

    Mag eben kein MS Visual Studio und das andere Zeugs, weil ich unter Linux und Windows schreiben möchte. Gibt's zwar Alternativen, aber Code::Blocks ist das einzige Program, dass unter beiden System sauber läuft.

    Was verwendest den du den so? 😕

    Das ist zwar ein wenig offtopic, aber ich verwende Visual C++ Professional und wxWidgets seit mehr als 5 Jahren zusammen. Und es funktioniert großartig.
    wxFormbuilder ist definitiv das bessere Tool, im Vergleich mit wxSmith.
    Aber ich nutze auch nicht die Code-Generation, sondern wxRC.



  • Mag eben kein MS Visual Studio und das andere Zeugs, weil ich unter Linux und Windows schreiben möchte. Gibt's zwar Alternativen, aber Code::Blocks ist das einzige Program, dass unter beiden System sauber läuft.

    Was hat dir bei DialogBlocks, PHES und wxFormBuilder unter Windows bzw. Linux nicht gefallen?
    Wenn du die Probleme/Fehler näher beschreibst, könnte man den Entwicklern eine Liste mit den gefunden Fehlern schicken und wir hätten dann alle was davon. 😃



  • @kakadu: Stimmt, md5sum ist eine Konsolenanwendung für Linux. Diese habe ich nicht, weil ich Windows benutze. Das hatte ich gar nicht realisiert, da liegt der Fehler.

    Nebenbei, ich kenne keinen Profi, der C::B verwendet. Sorry!

    Was für Cross-Platform-IDEs benutzen Profis denn, die plattformunabhängig programmieren müssen/wollen?



  • *push*



  • Marktführer ist noch Nokia mit dem QT Creator.

    Wer auf wxWidgets steht 😃 😃 und sich nicht an einen Großkonzern binden will, besitzt zumindest DialogBlocks (Ist in dem wxWidgets Buch bereits enthalten). Dann gäb´s noch PHES 2011.
    (Unter http://wiki.wxwidgets.org/Tools findest du die passenden Links)

    Es soll aber auch C++ Entwickler geben, die in der Java IDE Eclipse das CDT installieren und dann alles per Hand reinklopfen. 😕



  • [quote="Xbody"][quote="kakadu"].... Nebenbei, ich kenne keinen Profi, der C::B verwendet. Sorry![/quote]
    Mag eben kein MS Visual Studio und das andere Zeugs, weil ich unter Linux und Windows schreiben möchte. Gibt's zwar Alternativen, aber code:Blocks ist das einzige Program, dass unter beiden System sauber läuft.

    Was verwendest den du den so? 😕[/quote]

    Qt Creator duerfte zumindest den Anspruch "laeuft auf Windows, Linux und anderswo, und kann C++" erfuellen.


Anmelden zum Antworten