Seite 1 von 1

QT3 Programm auf QT4 //Beispiel Buch

Verfasst: 17. Februar 2009 15:01
von Zephyr
Hi an Alle

Ich bin zur Zeit in einem Praktikum und muss dafür QT 4 lernen ,leider hate ich in QT, sowie C++ nie programmiert. Ich hab zu allem übel nur ein QT3 Buch zum lesen und da sind einige Teile veraltet ,bisher konnte ich das sehr gut lösen aber bei einer Stelle haperts ,da komm ich nicht weiter...

ich poste mal meinen code

finddialog.h

Code: Alles auswählen

/*
 *  main.h
 *  QT_FE_2_1
 *
 *  Created by Alexander  on 17.02.09.
 *  Copyright 2009 __MyCompanyName__. All rights reserved.
 *
 */

#ifndef FINDDIALOG_H
#define FINDDIALOG_H

#include <qdialog.h>

class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;

class FindDialog : public QDialog
{
Q_OBJECT
public:
	FindDialog(QWidget *parent = 0, const char *name = 0);
signals:
void findNext(const QString &str, bool caseSensitive);
void findPrev(const QString &str, bool caseSensitive);

private slots:
void findClicked();
void enableFindButton(const QString &text);

private:
QLabel *label;
QLineEdit  *lineEdit;
QCheckBox *caseCheckBox;
QCheckBox *backwardCheckBox;
QPushButton *findButton;
QPushButton *closeButton;

};

#endif


hier meine finddialog.cpp

Code: Alles auswählen


/*
 *  main.cpp
 *  QT_FE_2_1
 *
 *  Created by Alexander  on 17.02.09.
 *  Copyright 2009 __MyCompanyName__. All rights reserved.
 *
 */

#include <qcheckbox.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qlineedit.h>
#include <qpushbutton.h>


#include "finddialog.h"


FindDialog::FindDialog(QWidget *parent,const char *name) : QDialog(parent,name)
//Hier tritt der Fehler auf


{
	setWindowTitle(tr("Find"));
	
	label = new QLabel(tr("Find &what:"), this);
	lineEdit = new QLineEdit(this);
	label->setBuddy(lineEdit);
	
	caseCheckBox = new QCheckBox(tr("Match &case"), this);
	backwardCheckBox = new QCheckBox (tr("Search &backward"), this);
	
	findButton = new QPushButton(tr("&Find"), this);
	findButton->setDefault(true);
	findButton->setEnabled(false);
	
	closeButton = new QPushButton(tr("Close"), this);
	
	
	connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(enableFindButton(<#const QString#> &)));
	connect(findButton, SIGNAL(clicked()), this, SLOT(findclicked()));
	connect(closeButton, SIGNAL(clicked()),this,SLOT(close()));
	
	
			QHBoxLayout *topLeftLayout = new QHBoxLayout;
			topLeftLayout->addWidget(label);
			topLeftLayout->addWidget(lineEdit);
			
			QVBoxLayout *leftLayout = new QVBoxLayout;
			leftLayout->addLayout(topLeftLayout);
			leftLayout->addWidget(caseCheckBox);
			leftLayout->addWidget(backwardCheckBox);
	
			QVBoxLayout *rightLayout = new QVBoxLayout;
			rightLayout->addWidget(findButton);
			rightLayout->addWidget(closeButton);
			rightLayout->addStretch(1);
			
			QHBoxLayout *mainLayout = new QHBoxLayout(this);
			mainLayout->setMargin(11);
			mainLayout->setSpacing(6);
			mainLayout->addLayout(leftLayout);
			mainLayout->addLayout(rightLayout);
			
			}

der fehler erscheint bei meinem Kommentat,der Compiller meldet:
no matching function for Call to 'QDialog::QDialog(QWidget*&, const char*&)'

Hat jemand von euch vielleicht jemand einen Rat wie ich das lösen kann ?
Was besagt diese Fehlermeldung genau und wodurch tritt der Fehler auf ?


zur Information, das Buch um welches es sich handelt ist: C++ Gui Programming with Qt3
von Jasmin Blanchette
und Mark Summerfield


Vielen Dank für Eure Antworten im Vorraus

Verfasst: 17. Februar 2009 15:35
von franzf
Wenn du dich wirklich an ein Buch klammern willst, hol dir einfach das aktuelle zu Qt4 (Galileo oder Addison-Wesley haben AFAIR eines im Programm)
Und für dein Problem würde ein Blick in die Doku.
Ja, die Qt4-Doku ist gigantisch (->assistant). Da erübrigt sich fast jedes Buch, wenn man C++ kann.

Verfasst: 17. Februar 2009 15:45
von Zephyr
das ist leider mein Problem ,ich kann leider kein c++


ich hab ne aktuelle Version von dem Programm im Netz gefunden (also eine QT4 Variante ,diesmal scheint der Fehler schwerwiegender zu sein ,da schätze ich ist der Fehler nicht im Code ,diese Fehler bekam ich in meinem Programm also ich es schon korrigiert habe.

XCode sagt:

Line Location Tool:0: "FindDialog::enableFindButton(QString const&)", referenced from:

Line Location Tool:0: "FindDialog::findClicked()", referenced from:

Line Location Tool:0: "qInitResources_application()", referenced from:


zum Buch ,ich bekomme ein neues aber ich muss erstmal mit diesem auskommen ,ich werde erstmal versuchen ein Lösung für das neue Problem zu finden, vielleicht kennt jemand dieses Problem schon

Verfasst: 17. Februar 2009 15:45
von Christian81
Dann lern erstmal C++ bevor Du mit einem C++-Framework anfängst.

Verfasst: 17. Februar 2009 15:51
von Zephyr
naja das wie gesagt ich bin leider hier im Praktikum ,mache das ganze also nicht freiwillig und meine Vorgesetzten möchten dass ich C++ und QT im Zusammenspiel lerne.

Private könnte ich mich mit C++ selber beschäftigen, hat da jemand für Ratschläge bzw ein gutes Buch ?

Verfasst: 17. Februar 2009 15:55
von erpheus
Aber hier ne Lösung zu deinem Problem:

Code: Alles auswählen

FindDialog::FindDialog(QWidget *parent,const char *name) : QDialog(parent,name) 
Du hast ja geschrieben, dass Du neben Qt auch noch C++ lernen musst. In obigen Code kommt wie Du schreibst deine Fehlermeldung.

Also Du lässt deine Klasse FindDialog von QDialog erben. Mit obigen Code rufst du vor deinem eigenen Konstrukten den von QDialog auf mit parent und name als Übergabeparmeter. Der ':' steht hier für einen Instanziierungsparamter. Das bedeudet danach kommt eine Liste von Werten die vor dem Konstruktor inizialisiert werden sollen. Dahe erst der Aufruf des QDialog Konstruktors.

Mit den bereits genannten Übergabeparametern müßtees also in der Klase QDialog folgenden Konstruktor geben:

Code: Alles auswählen

QDialog::QDialog(QWidget* parent, const char* name)
Deine Fehlermeldung sagt Dir nun das es diesen nicht gibt.

Also ab einen Blick in die Qt-Doku (Qt-Assistent) und in der Klassendoku von QDialog nach schauen.
Feststellung den gibt es nicht.

Sondern nur den hier:

Code: Alles auswählen

QDialog ( QWidget * parent = 0, Qt::WindowFlags f = 0 )

Verfasst: 17. Februar 2009 15:56
von Zephyr
danke für deine Hilfe ,dieses Problem hab ich allerdings schon gelöst und bekomme dafür andere


Undefined symbols:
"_main", referenced from:
__start in crt1.o
"FindDialog::findClicked()", referenced from:
FindDialog::qt_metacall(QMetaObject::Call, int, void**)in moc_finddialog.o
"FindDialog::enableFindButton(QString const&)", referenced from:
FindDialog::qt_metacall(QMetaObject::Call, int, void**)in moc_finddialog.o
ld: symbol(s) not found



hier wenn ichs nicht in xcode sondern mit g++ übersetze
ist also die selbe fehlermeldung wie bei xcode ,kann also ausschließen dass es daran liegt ,hier bin ich aber wirklich überfragt…

hier noch mal das selbe mit der debug option

Code: Alles auswählen

Reaping winning child 0x001161e0 PID 3379 
g++ -headerpad_max_install_names -o finddialog.app/Contents/MacOS/finddialog finddialog.o moc_finddialog.o   -F/Library/Frameworks -L/Library/Frameworks -framework QtGui -framework Carbon -framework AppKit -framework QtCore -lz -lm -framework ApplicationServices
Live child 0x001161e0 (finddialog.app/Contents/MacOS/finddialog) PID 3380 
Undefined symbols:
  "_main", referenced from:
      __start in crt1.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
Reaping losing child 0x001161e0 PID 3380 
make: *** [finddialog.app/Contents/MacOS/finddialog] Error 1
Removing child 0x001161e0 PID 3380 from chain.


Verfasst: 17. Februar 2009 17:20
von erpheus

Code: Alles auswählen

connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(enableFindButton(<#const QString#> &)))
und

Code: Alles auswählen

void enableFindButton(const QString &text); 
passen nicht zusammen
und
<#const QString#> hab ich noch nie gesehen wenn das '#' Zeichen in C++ ne bedeutung hat würd ich es gern wissen.

Verfasst: 17. Februar 2009 17:41
von franzf
Öhm... du hast schon in irgend einem deiner Source-Files ein int main( int argc, char** argv ) stehen?
Ich denke nicht, so würde ich jedenfalls die Meldung

Code: Alles auswählen

Undefined symbols:
  "_main", referenced from:
      __start in crt1.o
ld: symbol(s) not found 
deuten.

Verfasst: 17. Februar 2009 18:28
von Strahlex
Ich würde an deiner Stelle auch zuerst die C++ Basics lernen, gibt genug Tutorials dafür im Netz.
Kannst du irgentwelche anderen Programmiersprachen? Ich habe zum Beispiel ein Delphi zu C++ Tutorial gemacht und dann einfach mit der Qt Doku angefangen (Tutorial Abschnitt).