Seite 1 von 1

Error C2248

Verfasst: 4. Januar 2011 02:09
von daffi
Hey Leute, ich bekommen folgenden Compilerfehler bei der Übergabe eines QProgressDialoges an eine Funktion:

error C2248: "QProgressDialog::QProgressDialog": Kein Zugriff auf private Member, dessen Deklaration in der QProgressDialog-Klasse erfolgte.

Codeausschnitte:





void ftp(){


QProgressDialog *progress= new QProgressDialog("Copying files...", "Abort Copy", 0, 100, this);
progress->setWindowModality(Qt::WindowModal);

QFile *file = new QFile( "C:\\Users\\Daffi\\Desktop\\test.txt" );
file->open(QIODevice::ReadWrite);

QFtp *ftp = new QFtp();

ftp->setTransferMode(QFtp::Active);
ftp->connectToHost("ftp.trolltech.com");
ftp->login();

ftp->get("robots.txt",file,QFtp::Binary);
//connect(ftp, SIGNAL(done(bool)), &progress, SLOT(setValue(100)));
connect(ftp, SIGNAL(done(bool)), this, SLOT(ftp_ende(progress)));

progress->exec();
progress->setValue(100);

ftp->close();
progress->close();

delete ftp;
delete file;
return;
}


void ftp_ende(QProgressDialog progress)
{
progress.setValue(100);
close();
}


Ich weis das es etwas im roten Bereich zu tun hat aber warum ich auf die Set Methoden nicht zugreifen darf ist mir schleierhaft.

Danke
Daffi

Verfasst: 4. Januar 2011 07:30
von franzf
Der error enthält normalerweise eine Zeilenangabe, in der der Fehler auftritt. Wenn das der connect ist -OK.
Ich denke er ist es nicht. QProgressDialog erbt von QObject, und das ist nicht kopierbar! Das erreicht man üblicherweise dadurch, dass man Kopierkonstruktor und Zuweisungsoperator im private-Bereich der Klasse deklariert. Die entstehende Fehlermeldung sieht dann so aus wie die Deinige.

Wenn du die komplette Fehlermeldung posten könntest, wäre schon einiges gewonnen.

Verfasst: 4. Januar 2011 08:39
von Christian81
1. hast Du immer noch die gleichen Probleme - Du löschst ftp und file bevor überhaupt was passiert
2. übergibst du beim auskommentierten connect einen Pointer auf einen Pointer (&progress) - wie soll das gehen?
3. das connect kann nicht funktionieren - da passt rein gar nichts - also siehe Doku!
4. ftp_ende sieht nicht wie eine Klassenfunktion aus und dort kommt auch die Fehlermeldung her da man QProgressDialog nicht kopieren kann - wie wäre es wenn man mit C++ Grundlagen anfängt und sich danach mit Qt beschäftigt?

Verfasst: 4. Januar 2011 13:11
von daffi
Christian hast du die Weisheit mit Löffeln gefressen?

1. guck genauer hin ich führe den Dialog aus welcher auch jedesmal solange bleibt bis das File geladen ist....
2. Weshalb ist das wohl auskommentiert???
3.Komisch ist nur das mein connect funktioniert.
4.Es ist eine Klassenfunktion...schlaumeier!

Und nein es gibt leider keine Zeilennummer mit aus ....

Verfasst: 4. Januar 2011 13:22
von Christian81
1. Falsch - keine Eventloop also auch kein Dialog und keine Signal/Slot Verarbeitung usw. Da funktioniert einfach nichts. Es blockiert nichts (soll ja auch nichts) und deshalb wird alles gelöscht bevor Qt überhaupt eine Chance hat in die Eventloop zu kommen und was zu tun...
2. keine Ahnung :)
3.Das connect funktioniert definitiv nicht.. siehe http://doc.trolltech.com/4.7/qobject.html#connect-2 - da gibts nen Rückgabewert.
4. Sieht man aber nicht in deinem Beispiel.

Verfasst: 4. Januar 2011 13:37
von franzf
daffi hat geschrieben:4.Es ist eine Klassenfunktion...schlaumeier!

Und nein es gibt leider keine Zeilennummer mit aus ....
Das ftp_ende hab ich übersehen... Hier wird kopiert, das hat dir Christian gesagt (in seinem "4"). Wenn du das nicht erkennst, solltest du wirklich den Rat befolgen und noch mal in Richtung C++-Grundlagen schauen.
Bitte pack doch deinen Code in code-Tags statt quotes, die fehlende Einrückung verbaut die Lesbarkeit. Ich hab das Rote auch erst nach deiner Beschreibung gesehen, mit viel Mühe. Bin leider Farbenblind...
Das nächste mal code-Tags verwenden und die entsprechenden Zeilen mit C++-Kommentaren markieren.

Verfasst: 4. Januar 2011 13:54
von daffi
Sorry wegen den Quotes anstatt code Blöcken, hatte mich verklickt.


progress->exec(); --> ist doch die Event Loop oder?

In dem Code oben habe ich nur probiert in wie weit ich den progress Dialog übergeben kann.
Leider funktionierte das aufgrund des Fehlers nicht.

Code: Alles auswählen

.
.
.

public slots:
	 void ftp(){
	

		 QProgressDialog progress("Copying files...", "Abort Copy", 0, 100, this);
		 progress.setWindowModality(Qt::WindowModal);

		QFile *file = new QFile( "C:\\Users\\Daffi\\Desktop\\test.txt" );
		file->open(QIODevice::ReadWrite);
 
		QFtp *ftp = new QFtp();
 
		ftp->setTransferMode(QFtp::Active);
		ftp->connectToHost("ftp.trolltech.com");
		ftp->login();
		
	        ftp->get("robots.txt",file,QFtp::Binary);    
		connect(ftp, SIGNAL(done(bool)), this, SLOT(ftp_ende()));

		progress.exec();
		progress.setValue(100);
		              
		ftp->close();
		progress.close();

		delete ftp;
		delete file;
		return;
	}

	void ftp_ende()
	{
	close();
	}

};
Das ist mein richtiger Code,welcher geht und mir die Datei ohne Probleme lädt.
Ich will nur noch im ftp_ende auf den oben erstellten QProgressDialog zugreifen.

Und darans cheiterte es.

Verfasst: 4. Januar 2011 14:28
von Christian81
Dann muss QProgressBar eben eine Member-Variable sein.

Verfasst: 4. Januar 2011 14:44
von daffi
Jup das geht, Danke dir.

Aber dennoch geht mein Konstrukt mit QProgressDialog...
Durch das exec hab ich im Prinzip genau so eine Schleife wie du mit deinem QCore, stimmts?

Oder liege ich hier falsch?

Verfasst: 4. Januar 2011 14:46
von Christian81
Nein, das stimmt - das exec() habe ich an dieser Stelle übersehen.
btw: Den Progressbar kann man schön mit dem Signal QFtp::dataTransferProgress() befüllen lassen.

Verfasst: 4. Januar 2011 14:58
von daffi

Code: Alles auswählen

	 void ftp(){
	
		this->progress= new QProgressDialog("Copying files...", "Abort Copy", 0, 100, this);
		this->progress->setAutoReset(0);

		//Abbruchbutton - Event wenn gedrückt
		connect(progress, SIGNAL(canceled()), this, SLOT(abort()));

		//File zum schreiben/lesen öffnen
		file = new QFile( "C:\\Users\\Daffi\\Desktop\\test.txt" );
		if(!file->open(QIODevice::ReadWrite))
		{
			//wenn nicht zu öffnen
			//Todo
			delete file;
			return;

		}

		//Ftp bereistellen
		this->ftpzeiger = new QFtp();
		this->ftpzeiger->setTransferMode(QFtp::Active);

		//Events für Ende und Datenübertragung
		connect(ftpzeiger, SIGNAL(done(bool)), this, SLOT(ftp_ende()));
		connect(ftpzeiger, SIGNAL(dataTransferProgress(qint64, qint64)), this, SLOT(ftp_progress(qint64,qint64)));	
		connect(ftpzeiger, SIGNAL(commandFinished(int,bool)),this, SLOT(ftp_CommandFinished(int,bool)));
		connect(ftpzeiger, SIGNAL(commandStarted(int)),this, SLOT(ftp_CommandStarted(int)));

		//Host
		this->ftpzeiger->connectToHost("ftp.trolltech.com");

		//Logindaten
		this->ftpzeiger->login();
		
		//Verzeichnis und File auswählen
		this->ftpzeiger->cd("qt/add-ons");                     
		this->ftpzeiger->get("qt-mobility-symbian-1.1.0-symbian3-nokia-signed.sis",file,QFtp::Binary); 

		//Event Schleife
		this->progress->exec();

		//Aufräumen
		//this->progress=NULL;  -> später machen, sonst exception
		//this->ftpzeiger->close();
		//this->ftpzeiger=NULL;
		//this->file->close();
		//this->file=NULL;

		return;
	}

	void ftp_ende(){
		if(ftpzeiger->error()==0){
			ui.textEdit->append("INSTALL erfolgreich heruntergeladen!");
			this->progress->setValue(this->progress->maximum());
		}
		else{
			ui.textEdit->append("Beim Download trat ein Fehler auf!");
			this->progress->close();
			return;
		}
	}

	void ftp_progress(qint64 done,qint64 total){	
		this->progress->setMaximum(total);
		this->progress->setValue(done);
	}
	void ftp_CommandFinished(int, bool error){

		if (ftpzeiger->currentCommand() == QFtp::ConnectToHost) {
			ui.textEdit->append("Verbindung zum Host aufgebaut...");
			if (error){	
				ui.textEdit->append(ftpzeiger->errorString());
				return;
			}
		}

		if (ftpzeiger->currentCommand() == QFtp::Login){
			ui.textEdit->append("Logindaten ueberprüft...");
			 if (error) {
				 ui.textEdit->append(ftpzeiger->errorString());
				 //ui.textEdit->append("Logindaten Fehlerhaft...");
				 return;
			 }
		}

		if (ftpzeiger->currentCommand() == QFtp::Get) {
			ui.textEdit->append("Datenuebertragung beendet...");	
			 if (error) {
				 ui.textEdit->append(ftpzeiger->errorString());
				 file->close();
				 file->remove();
				 return;
			 }
		}
	}
	
	void ftp_CommandStarted(int id){
			
		if (ftpzeiger->currentCommand() == QFtp::ConnectToHost) 
			ui.textEdit->append("Verbindung zum Host wird aufgebaut...");
			
		if (ftpzeiger->currentCommand() == QFtp::Login)
			ui.textEdit->append("Logindaten werden ueberprüft...");
			
		if (ftpzeiger->currentCommand() == QFtp::Get) 
			ui.textEdit->append("Datenuebertragung gestartet...");	
	}
So das ist meine neuer Code...
Geht auch ohne Probleme bis auf 3 Stellen...

1. Es passiert nichts wenn ich auf abbrechen klicke... (obwohl Slot eigentlich gesetzt ist)
2. Wenn der Pfad falsch ist wie fange ich das ab?
3. Es geht ums aufräumen nach getaner Arbeit...

Der Block :
//this->progress=NULL; -> später machen, sonst exception
//this->ftpzeiger->close();
//this->ftpzeiger=NULL;
//this->file->close();
//this->file=NULL;

führt immer zu exceptions...

Wie räume ich mit den zeigern am Ende richtig auf und wenn ihr noch hinweise habt (grade auch in der commandfinished Funktion) nur her damit!

Danke Daffi