PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : QProcess-Fehler



doitux
11-02-2004, 06:27
Hallo Leute

Beim kompilieren eines Programmes ist mir eine Fehlermeldung untergekommen die ich beim besten Willen nicht verstehe.
kann mir eventuell jemand sagen, was das mit dem "struct QProcess" sein soll?

videorec.cpp: In constructor `Form3::Form3(QWidget*, const char*, bool, unsigned int)':
videorec.cpp:90: error: invalid use of undefined type `struct QProcess'
videorec.h:24: error: forward declaration of `struct QProcess'

vielen dank für die Infos
doitux

tuxipuxi
11-02-2004, 09:05
hi,

es ist einfacher zu helfen, wenn du die betreffenden codezeilen postest. ich würde einfach mal vermuten, dass qprocess.h nicht inkludiert ist.

gruss,
michael.

doitux
11-02-2004, 09:29
sorry genau das war das problem! genauso einfach zu lösen wie meine frage blöd war. aber manchmal steht man eben echt auf dem schlauch.

inzwischen hab ich ein ähnliches Problem. ich hab diesmal auch gleich überprüft ob ich alles includet habe.
ich poste hier mal die interessanten codezeilen:

string1 = new QString;

connect( lineEdit1, SIGNAL(textChanged(const QString&)), this, SLOT(cmdstring(const QString&)) );

void cmdstring( const QString &string, QString *string1 )
{
*string1 = string.text();
}

videorec.cpp: In function `void cmdstring(const QString&, QString*)':
videorec.cpp:108: error: `text' undeclared (first use this function)
videorec.cpp:108: error: (Each undeclared identifier is reported only once for each function it appears in.)

soweit ich weiß ist text() eine Methode der QLineEdit-class. die Headerfiles hab ich includet, aber trotzdem diese Fehlermeldung.
Hast du da noch ne idee?

danke
doitux

tuxipuxi
11-02-2004, 10:52
hi,

text() ist eine methode die in verschiedenen Qt klassen implementiert ist, z.b. QLineEdit, QTextEdit und QLabel.

QString hat diese methode aber nicht.
probier es mal so:
*string1 = string;

gruss,
michael.

doitux
11-02-2004, 11:15
danke schon mal. die letzte fehlermeldung ist weg.
nun gibts nur noch:

moc_videorec.o(.text+0x307): In function `Form3::qt_invoke(int, QUObject*)':
: undefined reference to `Form3::cmdstring(QString const&, QString*)'
collect2: ld returned 1 exit status
make: *** [videorecorder] Fehler 1

das kann ich nun beim besten willen nicht entschlüsseln. die meldung ist auch nicht so rot markiert wie die anderen.

weißt du was das ist?

nochmal danke das du dir die zeit nimmst
doitux

tuxipuxi
11-02-2004, 12:17
hi,

du definierst deine funktion ja so:



void cmdstring( const QString &string, QString *string1 )
{
*string1 = string.text();
}


so kann der compiler sie aber nicht als funktion deiner klasse erkennen, was aber zwingend notwendig ist, da du sie als slot verbindest.

es muss also so sein:
void Form3::cmdstring( const QString &string, QString *string1 ) ...

gruss,
michael.

doitux
11-02-2004, 12:39
nochmals danke. genau das war's.
jetzt kann ich es endlich kompilieren ;-) um festzustellen das es nicht funtzt :-(

wenn du noch lust hast kannst du ja mal drauf schauen
ich wollte einfach mal ein bischen mit qprocess, qstring und qlineedit probieren da ich meine shellscripts in qt-gui's umwandeln möchte.
das programm soll eine eingegebene internetadresse nach drücken des buttons mit dem konqueror aufrufen. später will ich mir dann nen videorecorder mit mencoder bauen.

prog.h -----------------------------------------------------------------------


#ifndef FORM3_H
#define FORM3_H

#include <qvariant.h>
#include <qdialog.h>

class QPushButton;
class QLineEdit;
class QProcess;
class QString;

class Form3 : public QDialog
{
Q_OBJECT

public:
Form3( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
~Form3();

QPushButton* pushButton7;
QLineEdit* lineEdit1;
QProcess* start_konqui1;
QString* string1;

public slots:
void start_konqueror1();
void cmdstring(const QString &, QString *);

protected:

protected slots:
virtual void languageChange();

};

#endif // FORM3_H


prog.cpp -----------------------------------------------------------------------


#include "prog.h"

#include <qpushbutton.h>
#include <qlineedit.h>
#include <qprocess.h>
#include <qstring.h>

Form3::Form3( QWidget* parent, const char* name, bool modal, WFlags fl )
: QDialog( parent, name, modal, fl )
{
if ( !name )
setName( "Form3" );

pushButton7 = new QPushButton( this, "pushButton7" );
pushButton7->setGeometry( QRect( 180, 430, 141, 41 ) );
QFont pushButton7_font( pushButton7->font() );
pushButton7_font.setPointSize( 16 );
pushButton7_font.setBold( TRUE );
pushButton7->setFont( pushButton7_font );

string1 = new QString;

lineEdit1 = new QLineEdit( this, "lineEdit1" );
lineEdit1->setGeometry( QRect( 30, 110, 220, 20 ) );

connect( pushButton7, SIGNAL( clicked() ), this, SLOT( start_konqueror1() ) );
connect( lineEdit1, SIGNAL(textChanged(const QString&)), this, SLOT(cmdstring(const QString&)) );
languageChange();
resize( QSize(335, 483).expandedTo(minimumSizeHint()));
clearWState( WState_Polished );
}

void Form3::cmdstring( const QString &string, QString *string1)
{
*string1 = string;
}

void Form3::start_konqueror1()
{
start_konqui1 = new QProcess(this);
start_konqui1->addArgument("konqueror");
start_konqui1->addArgument(*string1);
start_konqui1->start();
}

Form3::~Form3()
{

}

void Form3::languageChange()
{

pushButton7->setText( tr( "go!!!" ) );
}

tuxipuxi
11-02-2004, 15:01
hi,

das, was du da probierst, ist nicht die feine englische art :). so wie ich es sehe, hast du den designergenerierten sourcecode genommen und danach selbst verändert, oder? das sollte man auf keinen fall tun, weil nach einem zweiten aufruf des uic's (der, der aus .ui dateien sourcecode erzeugt ) die änderungen verloren gehen.

möglichkeiten:
ui.h benutzen -> siehe: http://doc.trolltech.com/3.3/designer-manual.html
subclassen -> siehe: http://doc.trolltech.com/3.3/designer-manual.html

aber nun zu deinem problem:

wie du sicher bemerkt hast, gibt dein programm beim start folgende meldung aus:

QObject::connect: No such slot Form3::cmdstring(const QString&)
QObject::connect: (sender name: 'lineEdit1')
QObject::connect: (receiver name: 'form3')

das bedeutet, dass signal&slot nicht übereinstimmen, in deinem fall liefert das signal nur einen parameter, dein slot nimmt aber zwei( siehe: http://www.trolltech.com/products/qt/whitepaper/qt-whitepaper-3.html ).

das kannst du umgehen, indem du in deinem slot nur noch den ersten parameter hast, den zweiten benutzt da ja sowieso nicht.

also müsste es so aussehen:

void Form3::cmdstring( const QString &string )
{
*string1 = string;
}

und in der klassendeklaration:

void cmdstring(const QString &);

.

mit diesen änderungen funktioniert dein programm.

es gibt jedoch eine wesentlich elegantere methode als deine: du musst garnicht jede änderung des textfeldes wahrnehmen und speichern, du kannst den text einfach abfragen( mit text() ).

dann müsste dein slot wie folgt aussehen:

void Form3::start_konqueror1()
{
start_konqui1 = new QProcess(this);
start_konqui1->addArgument("konqueror");
start_konqui1->addArgument(lineEdit1->text());
start_konqui1->start();
}

daraus folgt, dass du deinen cmdstring slot, den connect aufruf zu cmdstring sowie die membervariable string1 entfernen kannst.

BTW: Trolltech hat vor einiger zeit ein neues Qt buch rausgebracht, über das ich bis jetzt nur positive kommentare gehört hab. wenn du kein problem mit englisch hast und 37 euro übrig hast, solltest du dir "C++ Gui Programming with Qt 3" kaufen, da liegt auch eine Qt 3.2 windows non-commercial edition dabei.

gruss,
michael.

edit: in zukunft bitte ein archiv des programms anbieten.

doitux
11-02-2004, 15:24
erstmal vielen vielen dank. soviel hilfsbereitschaft hab ich noch in keinem forum erlebt.
das mit dem lineedit->text() hatt ich auch mal probiert hab dann aber wohl einen anderen fehler gemacht. auf jeden fall ging das erst nicht. aber jetzt funktioniert das prächtig.

danke auch für den buchtip. im prinzip hab ich mit english kein problem. ist nur etwas mühsam. kennst du ein gutes deutsches buch zu den thema. es geht mir im prinzip nur darum ein paar simple scripts in qt-progs umzuwandeln.
was hältst du von dem QT-Buch von Helmut Herold? lohnen sich die 66 ??


http://cgi.ebay.de/ws/eBayISAPI.dll?ViewItem&item=2786091856&ssPageName=ADME:X:ON:DE:2

das hab ich auch mal probiert. bin aber überboten worden.
naja jetzt hast du mich ja schon mal um einiges weitergebracht. und ich kann endlich wieder produktiv werden.

viele grüße
doitux

tuxipuxi
11-02-2004, 15:40
hi,


das buch von helmut herold steht in meinem bücherschrank. vor einiger zeit habe ich es noch empfohlen, jetzt rate ich davon aus verschiedenen gründen ab.
1. das buch ist mehr eine deutsche übersetzung der referenz als ein gutes buch.
2. es beschreibt Qt 2.3, was nicht mehr zeitgemäss ist.
3. es kostet 66 euro was ein wirklich frecher preis für die leistung ist.

ich habe mir auch das buch von Trolltech bestellt, wenn du willst sage ich dir, was ich von dem buch halte, sobald es hier eingetroffen ist. auch ohne es gelesen zu haben, lege ich meine hand dafür ins feuer, dass es ein super buch ist.

ein kommentar(echter von qtforum.org, kein marketinggeblubber):



I've just recieved my copy of the book and it is great. I've only had time to look through the basics yet (which I allready know) but each time that I try to outsmart the book and think to my self "now they will forget to mention <technical-detail-of-discussed-feature>" I find my self reading about that detail just seconds later.

It is easy to read, while being technically detailed. Great work!


ein sample chapter gibt es hier runterzuladen:
http://www.informit.com/promotions/promotions.asp?st={E6E5E6B3-C341-4B8A-B4DA-8B77A2574D95}
falls der download zu langsam ist, kannst du es auch von mir runterladen:
http://www.tuxipuxi.de/sample_chapter.pdf

gruss,
michael.

doitux
11-02-2004, 15:55
soetwas wie du über das buch schreibst hab ich schon vermutet. ich hatte mal einen auszug gelesen und auch das gefühl die referenz übersetzt zu lesen.

Aber das beispiel von deinem server sieht ja echt gut aus. ich werd meiner frau mal nen tip für mein geburtstagsgeschenk geben ;-)

hast du eigentlich ne website? ich hab mal http://www.tuxipuxi.de versucht, da kam aber nix.
so jetzt werd ich mich erstmal noch 3 stunden meinem studium widmen und dann hab ich endlich semesterferien.

bis später
doitux

tuxipuxi
11-02-2004, 16:09
nein, hab ich nicht :).