Anzeige:
Ergebnis 1 bis 11 von 11

Thema: Qt-Problem

  1. #1
    Registrierter Benutzer
    Registriert seit
    22.12.2003
    Beiträge
    19

    Qt-Problem

    also ich wollte ein Programm schreiben welches 3 Knöpfe 1 Schieberegler und 1 "LCD-Anzeige" mit einem Knopf sollte nun die Zahl auf dem LCD-Display erhöht(gleichzeitig der Schieberegler) und mit einem anderen verringert und mit dem 3. auf den Default-Wert vom 50 gesetzt werden ... die Zahl sollte sich ausserdem mit dem Schieberegler einstellen lassen ... okay hört sich eigentlich total einfach an aber wie kann ich eine Connection zwischen dem clicked() vom default-button(auf 50 setzen) und dem setValue von QSlider herstellen? ich hab das ganze durch eine neue Klasse machen wollen welche dazu einen neuen Solt hat ... aber schauts euch einfach mal an:

    Code:
    #include <qapplication.h>
    #include <qpushbutton.h>
    #include <qslider.h>
    #include <qlcdnumber.h>
    #include <qlabel.h>
    
    #include "kapache.h"
    
    class Def : public QSlider //Klasse mit dem Slot zum "auf standart-wert zurücksetzen"
    {
    Q_OBJECT 
    public:
    Def(int max,int min,int schritt,int deff, char const bla, QWidget *parent) : 
    QSlider(max,min,schritt,deff,QSlider::Horizontal, parent) 
    public slots: 
    void deffff(char const Slidername) 
    {
      Slidername*->setValue(50);  
    }
    };
    
    
    int main(int argc, char* argv[] )
    {
      QApplication KSlider (argc,argv);
    
      QWidget* Hauptwidget = new QWidget();
      Hauptwidget->setGeometry(400,300,200,150);
    
      /*QSlider* Slider = new QSlider (0,
                                      99,
                                      1,
                                      50,
                                      QSlider::Horizontal,
                                      Hauptwidget);
      Slider->setGeometry(10,10,180,30);*/
      Def* Slider = new Def (0,
                                      99,
                                      1,
                                      50,
                                      QSlider::Horizontal,
                                      Hauptwidget);
      Slider->setGeometry(10,10,180,30);
    
      QLCDNumber* LCD = new QLCDNumber( 2,Hauptwidget);
      LCD->setGeometry(60,50,80,50);
      LCD->display(50);
      
      QObject::connect(Slider, SIGNAL(valueChanged(int)), LCD, SLOT(display(int)));
    
      QPushButton* hoch = new QPushButton("hoch",Hauptwidget);
      hoch->setGeometry(10,110,50,30);
    
      QObject::connect(hoch,SIGNAL(clicked()), Slider, SLOT(addStep()));
    
      QPushButton* runter = new QPushButton("runter",Hauptwidget);
      runter->setGeometry(140,110,50,30);
    
      QObject::connect(runter,SIGNAL(clicked()), Slider,SLOT(subtractStep()));
      KSlider.setMainWidget(Hauptwidget);
    
      QPushButton* defalt = new QPushButton("default",Hauptwidget);
      defalt->setGeometry(75,110,50,30);
    
      QObject::connect(defalt,SIGNAL(clicked()), Def,SLOT(deffff("Slider")));     
      Hauptwidget->show();
      return KSlider.exec();                                
    }
    und wieso funktioniert das nun nicht? das bekomme ich als Output von KDevelop:


    main.cpp: In constructor `Def:ef(int, int, int, int, char, QWidget*)':
    main.cpp:32: error: parse error before `;' token
    main.cpp:35: error: `Slidername' undeclared (first use this function)
    main.cpp:35: error: (Each undeclared identifier is reported only once for each
    function it appears in.)
    main.cpp:35: error: parse error before `;' token
    main.cpp: In function `int main(int, char**)':
    main.cpp:82: error: parse error before `,' token

    Bitte helft mir bin schon total am verzweifeln ...

    und ja ich möchte das ganze mit einer neuen Klasse machen da ich das auch lernen möchte )

  2. #2
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    719
    Mach halt einen neuen Slot in deiner Fensterklasse, die den Wert auf 50 setzt und verbinde clicked von dem Knopf mit dem Slot.

  3. #3
    Registrierter Benutzer
    Registriert seit
    22.12.2003
    Beiträge
    19
    hmm in welcher Fensterklasse? haste mir da vielleicht ein Beispiel? kapier das grade nicht so
    sry ich hab von Qt noch 0 Tau und in C++ muss ich mich auch erst wieder einarbeiten ...

  4. #4
    Registrierter Benutzer Avatar von tuxipuxi
    Registriert seit
    30.08.2002
    Beiträge
    667
    hi,

    Code:
    #include <qvbox.h>
    #include <qslider.h>
    #include <qpushbutton.h>
    #include <qlcdnumber.h>
    
    
    class MyWidget : public QVBox { //von QVBox ableiten um alle widgets vertikal angeordnet zu haben
    Q_OBJECT
    public:
    
    	MyWidget( QWidget* parent=0, const char* name=0 );
    
    private slots:
    
    	void	increaseButtonClicked();
    	void	decreaseButtonClicked();
    	void	defaultButtonClicked();
    
    private:
    
    	QSlider 	*m_Slider;
    	QLCDNumber	*m_LCDNumber;
    
    
    };
    
    
    MyWidget::MyWidget( QWidget *parent, const char *name )
             :QVBox( parent, name )
    	 {
    	 	setMargin( 10 );
    
    	 	m_Slider = new QSlider( Qt::Horizontal, this );
    		m_Slider->setRange( 0, 100 );
    
    		m_LCDNumber = new QLCDNumber( this );
    
    		QPushButton *m_IncreaseButton = new QPushButton( "&Increase (+1)", this );
    		QPushButton *m_DecreaseButton = new QPushButton( "&Decrease (-1)", this );
    		QPushButton *m_DefaultButton  = new QPushButton( "De&fault", this );
    
    		connect( m_IncreaseButton, SIGNAL( clicked()), this, SLOT( increaseButtonClicked()) );
    		connect( m_DecreaseButton, SIGNAL( clicked()), this, SLOT( decreaseButtonClicked()) );
    		connect( m_DefaultButton, SIGNAL( clicked()), this, SLOT( defaultButtonClicked()) );
    		connect( m_Slider, SIGNAL( valueChanged( int )), m_LCDNumber, SLOT( display( int )) );
    
    	}
    
    
    void MyWidget::increaseButtonClicked()
    {
    	m_Slider->setValue( m_Slider->value() + 1 );
    	m_LCDNumber->display( m_Slider->value() );
    }
    
    
    void MyWidget::decreaseButtonClicked()
    {
    	m_Slider->setValue( m_Slider->value() - 1 );
    	m_LCDNumber->display( m_Slider->value() );
    
    }
    
    void MyWidget::defaultButtonClicked()
    {
    	m_Slider->setValue( 50 );
    	m_LCDNumber->display( 50 );
    }
    
    #include "moc_mrunix.cpp"
    
    int main( int argc, char* argv[] )
    {
    
    	QApplication	app( argc, argv );
    
    	MyWidget	*mw = new MyWidget( 0 );
    
    	app.setMainWidget( mw );
    
    	mw->show();
    
    	return app.exec();
    }
    gruss,
    tuxipuxi.
    Geändert von tuxipuxi (22-12-2003 um 22:03 Uhr)

  5. #5
    Registrierter Benutzer
    Registriert seit
    22.12.2003
    Beiträge
    19
    ich hab noch die headerdatei qapplication.h mitincludiert da es sonst nicht compiliert hat ... nun bekomme ich als Output:

    main.o(.text+0x20): In function `MyWidget::MyWidget[not-in-charge](QWidget*, char const*)':
    /usr/lib/qt3/include/qstring.h:770: undefined reference to `vtable for MyWidget'
    main.o(.text+0x2c):/usr/lib/qt3/include/qstring.h:771: undefined reference to `vtable for MyWidget'
    main.o(.text+0x220): In function `MyWidget::MyWidget[in-charge](QWidget*, char const*)':
    /home/Meister/test/test/main.cpp:47: undefined reference to `vtable for MyWidget'
    main.o(.text+0x22c):/home/Meister/test/test/main.cpp:47: undefined reference to `vtable for MyWidget'
    collect2: ld returned 1 exit status
    gmake[3]: Leaving directory `/home/Meister/test/test'
    gmake[3]: *** [test] Fehler 1
    gmake[2]: Leaving directory `/home/Meister/test/test'
    gmake[2]: *** [all-recursive] Fehler 1
    gmake[1]: Leaving directory `/home/Meister/test'
    gmake[1]: *** [all-recursive] Fehler 1
    gmake: *** [all] Fehler 2
    *** failed ***

    was könnte das nun wieder sein?

  6. #6
    Registrierter Benutzer Avatar von tuxipuxi
    Registriert seit
    30.08.2002
    Beiträge
    667
    hi,

    das qapplication inkludieren hab ich vergessen, sorry, geht aber auch ohne.

    wie du siehst, habe ich weiter unten moc_mrunix.cpp inkludiert, das ist eine datei, die ich mit dem meta object compiler erzeugen lasse. so eine datei musst du für jede datei erzeugen, in der du klassen die Q_OBJECT enthalten deklarierst, da Qt das für signals&slots braucht.
    in dieser datei wird auch qapplication.h eingebunden.. aber das inkludiere ich normalerweise auch selber, habs nur vergessen.

    also, du musst nun das mocfile erzeugen:

    moc mrunix.cpp > moc_mrunix.cpp

    mrunix.cpp -> der filename unter dem du mein beispiel gespeichert hast.
    moc -> nur wenn $QTDIR/bin im PATH ist, sonst mit voller pfadangabe wie /usr/lib/qt/bin/moc.

    der output wird dann in moc_mrunix.cpp geleitet und du solltest es wie üblich mit:
    g++ mrunix.cpp -I/$QTDIR/include -L/$QTDIR/lib -lqt-mt
    kompilieren können.

    alternativ kannst du qmake benutzen, wie das geht, bitte dem tutorial der documentation entnehmen.

    gruss,
    tuxipuxi.
    Geändert von tuxipuxi (23-12-2003 um 09:12 Uhr)

  7. #7
    Registrierter Benutzer
    Registriert seit
    22.12.2003
    Beiträge
    19
    thx nun läuft es
    so nun muss ich nurnoch den code verstehen ... hrhr *grübel*

    gestern ist das Qt-Buch von SuSE Press bekommen ist das eigentlich zu empfehlen oder soll ich es zurück zu Amazon schicken? Hab da nämlich nicht viel gutes drüber gelesen doch es war schon auf dem Versandweg ...

    edit:
    also was ich noch nicht ganz verstehe ist das "this" an den Stellen, an denen this steht sollte ja eigentlich das parent-widget stehen oder? für was ist this dann der Platzhalter?

    und wenn ich MyWidget nicht von QVBox beerben lassen möchte sollte das auch mit QWidget gehen oder?

    fragen über fragen ^^
    Geändert von McRip (23-12-2003 um 14:15 Uhr)

  8. #8
    Registrierter Benutzer Avatar von tuxipuxi
    Registriert seit
    30.08.2002
    Beiträge
    667
    hi,

    wenn du kannst, dann schick es zurück. trolltech veröffentlicht im januar oder februar ein buch über Qt mit windows non-commercial 3.2 und solchen sachen und auch inhaltlich wird das buch der hammer sein, muss ja auch, wenn es von Qt entwicklern geschrieben wurde.

    ich selber habe das von SUSE press und bin auch nicht so angetan, ausserdem behandelt es Qt 2.x .

    gruss,
    tuxipuxi.

    edit: wenn irgendwas nicht klar ist am code, frag einfach.

  9. #9
    Registrierter Benutzer
    Registriert seit
    22.12.2003
    Beiträge
    19
    okay werd das Buch dann heute noch zurückschicken und auf das von Trolltech warten danke für den Tip!

  10. #10
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von McRip
    also was ich noch nicht ganz verstehe ist das "this" an den Stellen, an denen this steht sollte ja eigentlich das parent-widget stehen oder? für was ist this dann der Platzhalter?
    Ja, "this" ist ein Name für die aktuelle Instanz der Klasse, deren Code gerade bearbeitet wird, also zu der die Methode gehört.

    Da deine Klasse indirekt von QWidget ableitet, kann sie als Parentwidget verwendet werden


    und wenn ich MyWidget nicht von QVBox beerben lassen möchte sollte das auch mit QWidget gehen oder?
    Ja, kein Problem.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  11. #11
    Registrierter Benutzer
    Registriert seit
    22.12.2003
    Beiträge
    19
    thx ))
    ich glaub dann hab ichs so einigermaßen kapiert vieles vieles Danke
    *auf das Trolltech-Buch wart*

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •