PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Qt-Problem



McRip
22-12-2003, 20:45
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:



#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::Def(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 :))

axeljaeger
22-12-2003, 20:52
Mach halt einen neuen Slot in deiner Fensterklasse, die den Wert auf 50 setzt und verbinde clicked von dem Knopf mit dem Slot.

McRip
22-12-2003, 20:54
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 ...

tuxipuxi
22-12-2003, 21:59
hi,



#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.

McRip
22-12-2003, 23:40
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? :(

tuxipuxi
23-12-2003, 09:04
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.

McRip
23-12-2003, 13:54
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 ^^

tuxipuxi
23-12-2003, 14:01
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.

McRip
23-12-2003, 14:28
okay werd das Buch dann heute noch zurückschicken und auf das von Trolltech warten :) danke für den Tip!

anda_skoa
23-12-2003, 16:33
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,
_

McRip
24-12-2003, 14:05
thx :)))
ich glaub dann hab ichs so einigermaßen kapiert :) vieles vieles Danke ;)
*auf das Trolltech-Buch wart*