Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » KDevelop / Qt / wxWidget » Warum geht dieses Programm 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
15.01.2005, 16:13 Uhr
firefoxxi



Ich habe folgendes Programm:


C++:
#include <qapplication.h>
#include <qpushbutton.h>
#include <qlineedit.h>
#include <qstring.h>
#include <qlabel.h>
#include <qvbox.h>
#include <qhbox.h>

class MyDialog : public QHBox
{
Q_OBJECT
    
private:
    QVBox* vbox1;
    QVBox* vbox2;
    QLabel* label1;
    QLabel* label2;
    QPushButton* button;
    QLineEdit* alter;
    QLineEdit* fhmax;
    
private slots:
    void Errechne();
    
public:
    MyDialog( QWidget *parent=0, const char *name=0 );
    ~MyDialog();
}

void MyDialog::Errechne()
{
    QString sAlter( alter->text() );
    QString sFHmax;
    int iFHmax;
    bool ok;

    int iAlter = sAlter.toInt( &ok );
    if(!ok)
    {
        fhmax->setText( "Ungültige Eingabe!" );
        return;
    }
    
    iFHmax = 226 - iAlter;
    sFHmax.setNum( iFHmax );
    fhmax->setText( sFHmax );
    
    return *this;    
}

MyDialog::MyDialog( QWidget *parent, const char *name )
    : QHBox( parent, name )
{
    vbox1 = new QVBox( this, "vbox1" );
    vbox2 = new QVBox( this, "vbox2" );
    label1 = new QLabel( "Lebensalter: ", vbox1, "label1" );
    alter = new QLineEdit( vbox1, "alter" );
    label2 = new QLabel( "FHmax: ", vbox2, "label2" );
    fhmax = new QLineEdit( vbox2, "fhmax" );
    button = new QPushButton( "Errechne!", this, "button" );
    
    fhmax->setEdited( false );
    
    connect( button, SIGNAL(clicked()), *this, Errechne() );
}

MyDialog::~MyDialog()
{
    delete vbox1;
    delete vbox2;
    delete label1;
    delete label2;
    delete alter;
    delete fhmax;
    delete button;
}

int main( int argc, char **argv )
{
    QApplication app(argc,argv);
    MyDialog diag;
    
    app.setMainWidget( &diag );
    return app.exec();
}



doch wenn ich es mit dem gcc compiliere erhalte ich folgende Fehlermeldungen:


Code:
FHmax.cpp:30: error: semicolon missing after declaration of `MyDialog'
FHmax.cpp:31: error: ISO C++ forbids defining types within return type
FHmax.cpp:31: error: two or more data types in declaration of `Errechne'
FHmax.cpp:31: error: prototype for `MyDialog MyDialog::Errechne()' does not match any in class `MyDialog'
FHmax.cpp:23: error: candidate is: void MyDialog::Errechne()
FHmax.cpp:31: error: `MyDialog MyDialog::Errechne()' and `void MyDialog::Errechne()' cannot be overloaded
FHmax.cpp:31: error: semicolon missing after declaration of `class MyDialog'
FHmax.cpp: In member function `int MyDialog::Errechne(MyDialog*)':
FHmax.cpp:41: error: return-statement with no value, in function declared with a non-void return type
FHmax.cpp:48: error: cannot convert `MyDialog' to `int' in return
FHmax.cpp: In constructor `MyDialog::MyDialog(QWidget*, const char*)':
FHmax.cpp:64: error: invalid use of void expression


--
Gruß
firefoxxi

http://firebird-browser.de/
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.01.2005, 19:54 Uhr
typecast
aka loddab
(Operator)


Ok. Du hast mehrere Fehler gemacht:

1.) Eine Klassendeklaration musst du mit einem ; abschliessen. Sonst denkt der Compiler, dass du eine Variable der Klasse deklarieren wolltest.

2.) Slots sind immer void. Das hast du zwar richtig gemacht, aber du gibst in dem Slot mit return *this etwas zurueck. Das ist falsch.

3.) connect( button, SIGNAL(clicked()), *this, Errechne() );
Hier stecken 2 Fehler drin. Erstens brauchst du this und nicht *this, da ein Zeiger erwartet wird. Dann kannst du nicht einfach Errechne() uebergeben. Du musst kennzeichnen, dass das ein SLOT ist. Der korrekte Aufruf ist:

connect( button, SIGNAL(clicked()), this, SLOT(Errechne()) );

4.) Eigene Klassen solltest du immer in getrennten Dateien anlegen. Sonst kann der moc-Prekompiler dureinander kommen.

5.) Du solltest das Widget auch anzeigen lasse. Standardmaessig sind die Widgets unsichtbar.
Deswegen muss noch die Anweisung diag.show(); in deine main-funktion.

Ich habe das mal fuer dich ein wenig umformatiert:


C++:
// test.h
#ifndef _MYDIALOG_H_
#define _MYDIALOG_H_

#include <qlineedit.h>
#include <qstring.h>
#include <qlabel.h>
#include <qvbox.h>
#include <qhbox.h>
#include <qpushbutton.h>

class MyDialog : public QHBox
{
Q_OBJECT

private:
    QVBox* vbox1;
    QVBox* vbox2;
    QLabel* label1;
    QLabel* label2;
    QPushButton* button;
    QLineEdit* alter;
    QLineEdit* fhmax;

private slots:
    void Errechne();

public:
    MyDialog( QWidget *parent=0, const char *name=0 );
    ~MyDialog();
};

#endif




C++:
#include "test.h"

void  MyDialog::Errechne()
{
    QString sAlter( alter->text() );
    QString sFHmax;
    int iFHmax;
    bool ok;

    int iAlter = sAlter.toInt( &ok );
    if(!ok)
    {
        fhmax->setText( "Ung?ltige Eingabe!" );
        return;
    }

    iFHmax = 226 - iAlter;
    sFHmax.setNum( iFHmax );
    fhmax->setText( sFHmax );

    //return *this;
}

MyDialog::MyDialog( QWidget *parent, const char *name )
    : QHBox( parent, name )
{
    vbox1 = new QVBox( this, "vbox1" );
    vbox2 = new QVBox( this, "vbox2" );
    label1 = new QLabel( "Lebensalter: ", vbox1, "label1" );
    alter = new QLineEdit( vbox1, "alter" );
    label2 = new QLabel( "FHmax: ", vbox2, "label2" );
    fhmax = new QLineEdit( vbox2, "fhmax" );
    button = new QPushButton( "Errechne!", this, "button" );

    fhmax->setEdited( false );

    connect( button, SIGNAL(clicked()), this, SLOT(Errechne()) );
}

MyDialog::~MyDialog()
{
    delete vbox1;
    delete vbox2;
    delete label1;
    delete label2;
    delete alter;
    delete fhmax;
    delete button;
}




C++:
// main.cpp
#include <qapplication.h>
#include "test.h"

int main( int argc, char **argv )
{
        QApplication app(argc,argv);
        MyDialog diag;

        app.setMainWidget( &diag );
        diag.show();
        return app.exec();
}


--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
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: