Seite 1 von 1

QListWidget Event wird nicht ausgelöst + anderes QListWidget

Verfasst: 9. Dezember 2008 17:26
von MasterMito
Hallo alle miteinander,

ich habe 2 kleine Problemchen mit Qt. Die Suchfunktion habe ich schon bemüht. Auch die Dokumentation sind wir schon zu dritt durch. Für ein Projekt soll ein Programm mit einer GUI geschrieben werden. Die GUI ist Qt, der Rest vom Programm ist in Old-School C geschrieben. Ich habe den Part bekommen die GUI zu programmieren, die bis auf eben diese 2 Probleme gut funktioniert.
Ich habe ein QListWidget in den QStrings reingeschrieben werden. Sobald ein Element aus der Liste angeklickt wird, brauche ich den QString des Eintrages wieder zurück für weitere Bearbeitungen. Das ist Problem Nummer 1.
Problem Nummer 2 ist folgendes, ich habe ein Signal auf mein QListWidget mit itemClicked. Doch dieses Event wird nie ausgeführt. Ich habe auch schon ein QListWidget übergeben. Hilft nichts. Das QListWidget bleibt tot.

Kompilieren und die anderen Funktionen kein Problem. nur daran beiße ich mir die Zähne aus. Schonmal merci im vorraus. Anbei ist noch ne kleine Ecke Code:

Code: Alles auswählen

#include "dvdcollector.h"

dvdcollector::dvdcollector(QMainWindow *parent) : QMainWindow(parent) {
	
	setupUi(this);
	
	isEditActive = false;
	isCollectionGeoeffnet = false;
	isGeaendert = false;
	
	filmliste -> insertItem(1, "Honk");
	QListWidgetItem item;

	/*Film aktuellerfilm = NULL*/
	
	felderSperren(true);
	
	/*Verbindet die Elemente des QT Designer mit Code*/
	connect (pushFilmBearbeiten, SIGNAL (clicked()), this, SLOT (bearbeiten()));
	connect (pushFilmAnlegen, SIGNAL (clicked()), this, SLOT (anlegen()));
	connect (pushFilmLoeschen, SIGNAL (clicked()), this, SLOT (loeschen()));	
	connect (pushcollectionOeffnen, SIGNAL (clicked()), this, SLOT (dateiOeffnen()));
	connect (pushCollectionSpeichern, SIGNAL (clicked()), this, SLOT (dateiSpeichern()));
	connect (pushZufallsfilm, SIGNAL (clicked()), this, SLOT (zufallsFilm()));
	
	connect (ButtonBildPfad, SIGNAL (clicked()), this, SLOT (bildpfad()));
	connect (buttonVerwerfen, SIGNAL (clicked()), this, SLOT (verwerfen()));
	connect (buttonSpeichern, SIGNAL (clicked()), this, SLOT (filmSpeichern()));
		
	connect (ButtonSuchen, SIGNAL (clicked()), this, SLOT (filmSuche()));	
	
	connect (filmliste, SIGNAL (itemClicked(*item)), this, SLOT (zeigeFilm()));
};


dvdcollector::~dvdcollector()
{
	if (close())
	{	
		
		QMessageBox::StandardButton ret;
        ret = QMessageBox::warning(this, tr("1337-DVD-Collector"),
                    tr("Möchten Sie vor dem Beenden des 1337-DVD-Collectors noch speichern?"),
                    QMessageBox::Save | QMessageBox::Cancel );
        if (ret == QMessageBox::Save) 
		{
			speichern(); 
		}
        else 
		{
			close();
		}
	}
}

/*Funktionsname anlegen()												*/
/*Funktionsbeschreibung SLOT zum Button Anlegen							*/
void dvdcollector::anlegen()
{
	if (isCollectionGeoeffnet)
	{
		/*Aktivieren der Buttons: Speichern, Verwerfen, Bildpfad*/
		isEditActive = true;

		/*Aufhebung der Sperrung der LineEdit's*/
		felderSperren(false);

		/*Leeren der Felder*/
		name -> setText("");
		genre -> setText("");
		jahr -> setText("");
		regisseur -> setText("");
		studio -> setText("");
		laenge -> setText("");
		darsteller -> setText("");
		usk -> setText("");	
	}
}

/*Funktionsname bearbeiten()											*/
/*Funktionsbeschreibung SLOT zum Button bearbeiten						*/
void dvdcollector::bearbeiten()
{
	if (isCollectionGeoeffnet)
	{
		/*Aktivieren der Buttons: Speichern, Verwerfen, Bildpfad*/
		isEditActive = true;

		/*Aufhebung der Sperrung der LindeEdit's*/
		felderSperren(false);

		/*wird evtl. entfernt*/
		/*name -> setText("aktuellerfilm->name");*/
		/*genre -> setText ("aktuellerfilm->genre");*/
		/*jahr -> setText("aktuellerfilm->jahr");*/
		/*regisseur -> setText("aktuellerfilm->regisseur");*/
		/*studio -> setText("aktuellerfilm->studio");*/
		/*laenge -> setText("aktuellerfilm->laenge");*/
		/*darsteller -> setText(""aktuellerfilm->darsteller);*/
		/*usk -> setText("aktuellerfilm->usk");*/
	}
}

/*Funktionsname loeschen()												*/
/*Funktionsbeschreibung SLOT zum Button löschen							*/
void dvdcollector::loeschen()
{
	if (isCollectionGeoeffnet)


	{
		/*aufrufen der Funktion zum löschen des Films aus der Liste */
		/*film_loeschen(aktuellerfilm->name);*/
	}
}

/*Funktionsname dateiOeffnen											*/
/*Funktionsbeschreibung SLOT zum Button Collection speichern			*/
void dvdcollector::dateiOeffnen()
{
	/*aufrufen der Funktion zum öffnen einer Datei*/
	oeffnen();
}

/*Funktionsname dateiSpeichern()										*/
/*Funktionsbeschreibung SLOT zum Button Collection speichern			*/
void dvdcollector::dateiSpeichern()
{
	/*aufrufen der Funktion zum speichern einer Datei*/
	speichern();
}


/*Funktionsname zufallsFilm()											*/
/*Funktionsbeschreibung SLOT zum Button Zufallsfilm						*/
void dvdcollector::zufallsFilm()
{
}

/*Funktionsname bildpfad()												*/
/*Funktionsbeschreibung SLOT zum Button Bildpfad						*/
void dvdcollector::bildpfad()
{
	if(isEditActive)
		/*aufrufen der Funktion zum öffnen des Dialogs*/
		pfadDialog();
}


/*Funktionsname verwerfen()												*/
/*Funktionsbeschreibung SLOT zum Button verwerfen						*/
void dvdcollector::verwerfen()
{
	if (isEditActive)
	{
		/*Zurückschreiben der alten Elemente
		QString name = QString("%1").arg(aktuellerfilm->name);
		/*name -> setText(name);
		
		QString genre = QString("%1").arg(aktuellerfilm->genre);
		/*genre -> setText(genre);
		
		QString jahr= QString("%1").arg(aktuellerfilm->jahr);
		/*jahr -> setText(jahr);
		
		QString studio = QString("%1").arg(aktuellerfilm->studio);
		/*studio -> setText(studio);
		
		QString laenge = QString("%1").arg(aktuellerfilm->laenge);
		/*laenge -> setText(laenge);
		
		QString darsteller = QString("%1").arg(aktuellerfilm->darsteller);
		/*darsteller -> setText(darsteller);
		
		QString usk = QString("%1").arg(aktuellerfilm->usk);
		/*usk -> setText(usk);
		if ((aktuellerfilm-> verliehen)!= 0)
		{
			checkBoxVerliehenAn -> setChecked(true);
			QString verliehenAn = QString("%1").arg(aktuellerfilm->verliehenAn);
			/*verliehenAn-> setText(verliehenAn);
		}
		
		/*Sperren der Felder*/
		felderSperren(true);
		
		/*Sperren der Knöpfe: Speichern, Verwerfen, Bildpfad*/
		isEditActive = false;
	}
}

/*Funktionsname filmspeichern()											*/
/*Funktionsbeschreibung SLOT zum Button Speichern						*/
void dvdcollector::filmSpeichern()
{
	if (isEditActive)
	{
		/*Holen der Elemente aus den LineEdit's*/
		/*aktuellerfilm->name = convert_QString(name->text());
		aktuellerfilm->genre = convert_QString(genre->text());
		aktuellerfilm->jahr = convert_QString(jahr->text());
		aktuellerfilm->regisseur = convert_QString(regisseur->text());
		aktuellerfilm->studio = convert_QString(studio->text());
		aktuellerfilm->laenge = convert_QString(laenge->text());
		aktuellerfilm->darsteller = convert_QString(darsteller->text());
		aktuellerfilm->usk = convert_QString(usk->text());*/
		
		isGeaendert = true;
		
		/*Sperren der Felder*/
		felderSperren(true);
	
		/*Sperren der Knöpfe: Speichern, Verwerfen, Bildpfad*/
		isEditActive = false;
	}
}

/*Funktionsname filmSuche()												*/
/*Funktionsbeschreibung SLOT zum Button Suchen, prüft ebenfalls, nach	*/
/*						was gesucht werden soll							*/
void dvdcollector::filmSuche()
{
}

void dvdcollector::zeigeFilm()
{
	QString filename = QFileDialog::getSaveFileName(this, tr("Speichern unter"),
			"", tr("1337 Datei (*.1337)"));
	zeigeDetails();
}

void dvdcollector::fuelleListe()
{
	/*int i;
	for (i = 1; i <= ret_laenge_liste, i++)
	{
		QString name = QString("%1").arg(*get_next_item);
		filmliste -> insertItem(i, name);
	}*/
}

void dvdcollector::zeigeDetails()
{
	//int filmPosition = (int)item->currentRow();
	name -> setText("Honk");
}
/*Funktionsname felderSperren()											*/
/*Funktionsbeschreibung sperrt und entsperrt die LineEdit's				*/
/*IN:  -bool sichtbarwert: true -> LineEdit's sind erreichbar			*/
void dvdcollector::felderSperren(bool sichtbarwert)
{
	name -> setReadOnly(sichtbarwert);
	genre -> setReadOnly(sichtbarwert);
	jahr -> setReadOnly(sichtbarwert);
	regisseur -> setReadOnly(sichtbarwert);
	studio -> setReadOnly(sichtbarwert);
	laenge -> setReadOnly(sichtbarwert);
	darsteller -> setReadOnly(sichtbarwert);
	usk -> setReadOnly(sichtbarwert);
}

/*Funktionsname oeffnen()												*/
/*Funktionsbeschreibung Fragt den User ob er seine bisherigen arbeiten	*/
/*						abspeichern möchte und ruft einen Öffnen-Dialog */
/*						auf*/
void dvdcollector::oeffnen()
{
	/*Prüft ob die bisherige Arbeit gespeichert werden soll*/
	if (vielleicht_speichern())
	{
		/*Öffnen des Dialogs und speichern des Pfades in fileName*/
		QString fileName = QFileDialog::getOpenFileName(this);
		/*Prüft ob der Pfad leer ist*/
		if (!fileName.isEmpty())
		{
			isCollectionGeoeffnet = true;
			/*aufrufen der Funktion Sammlungladen()*/
			/*Sammlungladen(convert_QString(filename))*/
		}
	}
}

/*Funktionsname speichern()												*/
/*Funktionsbeschreibung Ruft einen Speichern-Dialog auf und speichert   */
/*						die aktuelle Collection							*/
/*OUT: -bool : liefert zurück ob speichern erfolgreich war				*/
bool dvdcollector::speichern()
{
	/*Speichern-Dialog aufrufen, dieser liefert Pfad filename zurück*/
	QString filename = QFileDialog::getSaveFileName(this, tr("Speichern unter"),
			"", tr("1337 Datei (*.1337)"));
	/*Pfad darf nicht leer sein zum speichern*/
	if (!filename.isEmpty())
	{
		/*Speichern der aktuellen Collection*/
		/*Sammlungspeichern(convert_QString(filename))*/
	}
}

/*Funktionsname vielleicht_speichern()*/
/*Funktionsbeschreibung Frägt ob der User die aktuelle Colleection 		*/
/*						speichern möchte bevor der User die neue Liste	*/
/*						öffnen möchte.									*/
/*OUT: -bool: liefert zurück, ob der User Save, Discard oder Cancel 	*/
/*			  drückt*/
bool dvdcollector::vielleicht_speichern()
{
	if (isGeaendert)
	{
		/*QT MessageBox*/
		QMessageBox::StandardButton ret;
		/*Abfrage was mit aktueller Liste passieren soll*/
		ret = QMessageBox::warning(this, tr("Anwendung"), 
				tr("Das Dokument wurde verändert.\n" 
					"Möchten sie die aktuelle Collection speichern?"),
					QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
		if (ret == QMessageBox::Save)
			return speichern();
		else if (ret == QMessageBox::Cancel)
			return false;
	}
}

/*Funktionsname pfadDialog()											*/
/*Funktionsbeschreibung Öffnet einen Dialog in dem der Pfad eines 		*/
/*						Objektes gesucht/angegeben werden kann			*/
void dvdcollector::pfadDialog()
{
	QString fileName = QFileDialog::getOpenFileName(this);
}


/*Funktionsname convert_QString()										*/
/*Funktionsbeschreibung Wandelt einen QString in einen char um			*/
/*IN:  -QString String: der String der umgewandelt werden soll			*/
/*OUT: -char: der char des umgewandelten Strings						*/
char dvdcollector::convert_QString (QString String)
{
	/*Zwischenspeichern des QStrings in einem Bytearray mit Codierung*/
	/*Latin1*/
	QByteArray Qba = String.toLatin1();
	/*der umgewandelte String*/
	char *str_Datei = (char *) Qba.data();
	return (*str_Datei);
}

Verfasst: 9. Dezember 2008 17:31
von Christian81
Wie soll das funktionieren:

Code: Alles auswählen

 connect (filmliste, SIGNAL (itemClicked(*item)), this, SLOT (zeigeFilm())); 
Es gibt ein Signal "itemClicked(*item)"

Und hier passiert absolut nicht das was Du willst - oder interessiert dich immer nur der erste Buchstabe des Strings?

Code: Alles auswählen

char dvdcollector::convert_QString (QString String)
{
   /*Zwischenspeichern des QStrings in einem Bytearray mit Codierung*/
   /*Latin1*/
   QByteArray Qba = String.toLatin1();
   /*der umgewandelte String*/
   char *str_Datei = (char *) Qba.data();
   return (*str_Datei);
}
Und bevor Du einen char* zurückgibst - damit erzeugst Du nur coredumps :)

Verfasst: 9. Dezember 2008 17:37
von MasterMito
Ich habe laut Doku, das signal itemclicked eingebunden. oder bleiben die Klammern leer?

Das mit der Konvertierung haben wir uns von nem HiWi zeigen lassen. Der meinte das geht so. haben das probiert und es funktioniert tatsächlich.

Verfasst: 9. Dezember 2008 17:53
von Christian81
MasterMito hat geschrieben:Ich habe laut Doku, das signal itemclicked eingebunden. oder bleiben die Klammern leer?
http://doc.trolltech.com/4.4/signalsandslots.html
Das mit der Konvertierung haben wir uns von nem HiWi zeigen lassen. Der meinte das geht so. haben das probiert und es funktioniert tatsächlich.
Na wenn ihr meint...

Verfasst: 10. Dezember 2008 07:29
von AuE
aber wieso is der Rückgabetyp nur char???

und Signal/Slots werden so connected...

Code: Alles auswählen

  connect(signalMapper, SIGNAL(mapped(const QString &)),
         this, SLOT(readFile(const QString &)));
es wird nur angegeben was Übergeben wird vom Typ her, nicht vom Namen her

Verfasst: 10. Dezember 2008 11:25
von MasterMito
So, habe gestern bis in die Nacht rein Doku gewälzt.
Das connect funktioniert mittlerweile. Muss jetzt nur noch das QListWidget rausbekommen, den Text rausholen und meiner Funktion übergeben.

Unsere Funktion brauch auf jeden Fall Char's
Das Problem an diesem Projekt ist, das es in C geschrieben sein muss. Wir haben mit bitten und betteln Qt verwenden dürfen.

Wie lege ich denn den Namen fest, von dem was übergeben wird? in meinem Funktionskopf dann?

Merci schonmal

Verfasst: 10. Dezember 2008 12:46
von AuE
Genau.... im Fkt Kopf.... bei der Deklaration sind Namen ja nicht benötigt
du musst ja auch in einer h datei nicht den namen erwähnen...

zB

Code: Alles auswählen

void mach_was(const int &) 
ist völlig legitim.

in der definition schreibste ja dann

Code: Alles auswählen

void meine_klasse::mach_was(const int &Wert)
{}

btw:

C und Qt.... naja is schon nen Widerspruch... oder? Aber gut... wenns was fürs Auge sein soll ;-)

Verfasst: 10. Dezember 2008 19:36
von MasterMito
Nun ja. das auge war sage ich mal zweitrangig.
Die alternative wäre Win-Api gewesen. Dazu hatten wir genau ein Labor, der Prof keine Ahnung. Das war Abschreckend genug. Bin auf jeden Fall froh das es nun funktioniert.
Danke an alle für die Mühe.

Werde mich auf jeden Fall weiter in Qt reinarbeiten. Gefällt mir alles sehr gut. Bin von Java swing relativ verwöhnt.

Das Thema kann als gelöst abgehakt werden

Cee Ya

Verfasst: 11. Dezember 2008 07:02
von AuE
das musst du selbst tun ;-)

also am besten deinen eröffnungsbeitrag editieren und dort bei dem Beitragstitel [gelöst] voranstellen
:D