Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » KDevelop / Qt / wxWidget » Kleines Beispielprogramm funktioniert nicht

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
21.08.2003, 09:31 Uhr
~Einsteiger
Gast


Hallo!

So, habe jetzt mein erstes eigenes GUI-Programm unter Linux geschrieben, funktioniert aber nicht ganz. Das Programm habe ich in 3 Dateien aufgeteilt:




C++:
//--- Datei 1: programm1.cpp ---

#include<qapplication.h>
#include<qpushbutton.h>

#include "./myClass.h"

int main( int argc, char** argv )
{

  QApplication app (argc, argv);

  QWidget * window = new QWidget();

  app.setMainWidget(window);

  myClass* mc;
  mc->function1();

  QPushButton *Button = new QPushButton("Abbruch", window);
  QObject::connect (Button, SIGNAL(clicked()), mc, SLOT(slot1()));   // <-- FEHLER


  window->show();

  return app.exec();

}


//--- Datei 2: myClass.h ---

#include<qobject.h>

class myClass : public QObject{
Q_OBJECT

    public:
        void function1(void);
        
    public slots:
        void slot1();
};

//--- Datei 3: myClass.cpp ---

#include<qfiledialog.h>

#include "./myClass.h"

void myClass::function1(void){

    QString s(QFileDialog::getOpenFileName(""));
    if(!s.isEmpty())
        exit(0);

}

void myClass::slot1(){
    
    QString s(QFileDialog::getOpenFileName(""));
    if(!s.isEmpty())
        exit(0);

}



Habe die fehlerhafte Zeile mit einem Kommentar gekennzeichnet.
Das Programm sollte ein kleines GUI erstellen und ein Objekt vom Typ "myClass" anlegen.
Direkt beim Programmstart soll die Funktion "function1" des Objekts aufgerufen werden, wodurch ein FileDialog angezeicht wird. Falls bei diesem etwas ausgewählt wird, dann wird das Programm beendet.
Gut, soweit funktioniert alles. Jetzt wollte ich allerdings, dass bei einem Klick auf den Button ebenfalls der FileDialog angezeigt wird. Und genau das Funktioniert nicht. Wenn ich das Klick-Ereignis des Buttons mit dem Slot meiner eigenen Klasse verbinden will beendet sich das Programm sofort - ich sehe (bis auf den FileDialog am Anfang) kein GUI. Ohne die Connect-Anweisung wird das GUI angezeigt.
Was habe ich falsch gemacht?

Ach, und noch eine zweite Frage: Wo befindet sich eigentlich die Codeausführung während das Fenster angezeigt wird? Bei VC++ wird immer eine Message-Loop durchlaufen, bei VB wird während der Benutzer nichts anklickt gar kein Code ausgeführt (zumindest aus Sicht des Anwendugs-Programmierers).
Wie ist es hier?

Danke!

mfg

--edit: Pablo, [ cpp ] Tags eingefügt --

Dieser Post wurde am 21.08.2003 um 10:45 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.08.2003, 09:37 Uhr
~bussibär
Gast


probier mal bei connect statt mc "this" anzugeben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.08.2003, 10:58 Uhr
Pablo
Supertux
(Operator)


Ich glaube nicht, dass die Lösung "this" statt "mc" ist. Denn this ist ein Pointer "auf sich selbst" und in int main() bist du in gar keine Klasse, also vermute ich, dass wenn du "this" schreibst, wirst du den Code nicht kompilieren können. Ich bin nicht sicher, man muss es einfach versuchen.

Ich kenn leider kaum von GUI und kann dir nicht helfen.
Was ich gefunden hab:


Zitat:


Code:
bool QObject::connect ( const QObject * sender, const char * signal, const char * member ) const

This is an overloaded member function, provided for convenience. It behaves essentially like the above function.

Connects signal from the sender object to this object's member.

Equivalent to: QObject::connect(sender, signal, this, member).



Sorry @bussibär: ich glaube, dein Vorschlag war richtig, nach dieser Information.

Ich hab noch folgendes gefunden, das sollte funktionieren (QT Library)


C++:
QLabel     *label  = new QLabel;
    QScrollBar *scroll = new QScrollBar;
    QObject::connect( scroll, SIGNAL(valueChanged(int)),
                      label,  SLOT(setNum(int)) );


// This example ensures that the label always displays the current scroll bar value.

//A signal can also be connected to another signal:


    class MyWidget : public QWidget
    {
        Q_OBJECT
    public:
        MyWidget();

    signals:
        void myUsefulSignal();

    private:
        QPushButton *aButton;
    };

    MyWidget::MyWidget()
    {
        aButton = new QPushButton( this );
        connect( aButton, SIGNAL(clicked()), SIGNAL(myUsefulSignal()) );
    }



Da es eine QT Frage verschiebe ich dich mal
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 21.08.2003 um 11:07 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.08.2003, 12:16 Uhr
~Frank
Gast


Dein Proggi stürzt einfach ab, weil du connect auf einem nicht initialisierten Pointer machst.
->
myClass* mc;
durch
myClass* mc = new myClass();
ersetzen.

Zur 2.Frage, meines Wissens wird überhaupt kein Code ausgeführt.


Frank
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ KDevelop / Qt / wxWidget ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: