Problem mit ListBox und currentItem

Alles rund um die Programmierung mit Qt
Antworten
lori
Beiträge: 16
Registriert: 9. August 2004 13:06

Problem mit ListBox und currentItem

Beitrag von lori »

Hallo,

ich habe hier ein Problem. Untenstehend ist ein Button, eine ListBox und ein LineEdit. Bei einfachem klick auf einen Eintrag der ListBox ändert sich
der LineEdit. Das funktioniert soweit. Nun, wenn ich auf den Button klicke soll runSlot() abgearbeitet werden - das geht auch.
Nur soll jetzt in runSlot() das mom. Item mit liste->currentItem() abgefragt werden (ist das richtig - wenn man die Nummer des akt. items möchte?), und in der int mom abgelegt werden. Nur wie geht das, ich krieg das nicht irgendwie nicht auf die Reihe. Danke für Eure tatkräftige Unterstützung.


/*pushbutton 1*/
QPushButton *waehle = new QPushButton("Verbinden", win);
MyClass *my = new MyClass();
QObject::connect(waehle, SIGNAL(clicked()), my, SLOT(runSlot()) );

/*listbox 1*/
QListBox *liste = new QListBox(win,"Einwahl:");
while (t<i)
{
str.sprintf(einwahl[t]);
liste->insertItem(str);
t++;
}

/* Lineedit 1 - Einträge anzuzeigen.*/
QLineEdit *le = new QLineEdit(win,"lineedit");
le->setReadOnly(TRUE);
/* Verküpfung von ListBox und LineEdit*/
QObject::connect(liste,SIGNAL(highlighted(const QString &)),le,SLOT(setText(const QString &)));

void MyClass::runSlot()
{
.............
.............
}
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Re: Problem mit ListBox und currentItem

Beitrag von Goos »

lori hat geschrieben: Nur soll jetzt in runSlot() das mom. Item mit liste->currentItem() abgefragt werden (ist das richtig - wenn man die Nummer des akt. items möchte?), und in der int mom abgelegt werden. Nur wie geht das, ich krieg das nicht irgendwie nicht auf die Reihe. Danke für Eure tatkräftige Unterstützung.
Hi,

currentItem() is ansich schon richtig. "Nur wie geht das, ich krieg das nicht irgendwie nicht auf die Reihe." <-- Das is aber keine rechte Fehlermeldung ;) . Was geht genau nicht, was bekommst fuer Rueckmeldewerte, oder welche Fehlermeldungen?

Goos
jaegermeister
Beiträge: 70
Registriert: 11. August 2004 07:44
Wohnort: Bergen auf Rügen
Kontaktdaten:

Beitrag von jaegermeister »

QListBoxItem * QListBox::findItem ( const QString & text ) const
Finds the first listbox item which starts with text and returns it, or returns 0 of no such item could be found. The search is done case-insensitive.

Les den String aus dem Edit aus, und übergeb den String diese Funktion. Die Funktion gibt dir dann den int des Items zurück.
Wie könnten ja wenn wir wollten, aber wie wollen ja nicht.
lori
Beiträge: 16
Registriert: 9. August 2004 13:06

Beitrag von lori »

@jaegermeister
ich brauch ja das aktuelle highlighted item - da muss ich auf currentitem() zurückgreifen wenn ich das richtig gesehen habe.

@goos
ich weiss nicht wie ich das currentItem(); in dem void MyClass::runSlot()
abfragen kann - verwende ich liste->currentItem()
bekomme ich liste undeclared. Unter /*listbox 1*/ siehe code ist diese aber aufgeführt. Was mache ich falsch?
jaegermeister
Beiträge: 70
Registriert: 11. August 2004 07:44
Wohnort: Bergen auf Rügen
Kontaktdaten:

Beitrag von jaegermeister »

bekomme ich liste undeclared. Unter /*listbox 1*/ siehe code ist diese aber aufgeführt. Was mache ich falsch?
Übergebe an deine Funktion einen Zeiger auf die Liste.
Die Liste ist in der Funktion nicht bekannt sondern nur im Konstruktor vermutet ich.

Mfg jaegermeister
Wie könnten ja wenn wir wollten, aber wie wollen ja nicht.
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag von Goos »

Falls du deine Listbox vielleicht auch noch in deiner MyClass Klasse erzeugst, dann solltest aus liste wohl eine Membervariable deiner Klasse machen.

Goos
lori
Beiträge: 16
Registriert: 9. August 2004 13:06

Beitrag von lori »

Hi Goos,
kannst Du mir bitte sagen wie das geht? In main.cpp habe ich
QListBox *liste = new QListBox(win,"Einwahl:"); erzeugt. In Myclass.h ist runslot() definiert - von hier soll auf liste zugegriffen werden, so dass ich Daten in liste ändern kann mit liste-> ....
Wäre toll wenn Du mir weiterhelfen könntest. Befasse mich erst seit zwei Wochen mit C++ und QT und hab noch nicht soooo den Durchblick ;) - danke!
shermann
Beiträge: 4
Registriert: 27. August 2004 08:44

Beitrag von shermann »

lori hat geschrieben:Hi Goos,
kannst Du mir bitte sagen wie das geht? In main.cpp habe ich
QListBox *liste = new QListBox(win,"Einwahl:"); erzeugt. In Myclass.h ist runslot() definiert - von hier soll auf liste zugegriffen werden, so dass ich Daten in liste ändern kann mit liste-> ....
Wäre toll wenn Du mir weiterhelfen könntest. Befasse mich erst seit zwei Wochen mit C++ und QT und hab noch nicht soooo den Durchblick ;) - danke!
In deiner Klassendefinition sollte sowas wie:

Code: Alles auswählen

private: 
    QListBox *liste;
drin sein.
Dann kannst Du in deinem Konstruktor die Liste direkt generieren:

liste=new QListBox(....)

Du brauchst Sie dort nicht mehr zu deklarieren.

danach kannst Du ueberall in der Klasse auf "liste" zugreifen.

regards,

\sh
lori
Beiträge: 16
Registriert: 9. August 2004 13:06

Beitrag von lori »

Hi shermann,
wenn ich in MyClass.h bei
private:
QListBox *liste;

deklariere und im main.cpp

liste=new QListBox(win,"test");

geneneriere, bekomme ich wieder einen `liste' undeclared fehler im main.cpp angezeigt. Kannst Du mir bitte sagen wo mein Fehler liegt?
miketech
Beiträge: 125
Registriert: 3. August 2004 11:19

Beitrag von miketech »

Hi lori,

also ganz langsam:

Du hast in MyClass Deinen Slot runslot(). In diesem Slot möchtest Du die Variable "liste" ansprechen. Diese hast Du jedoch in Deiner main.cpp deklariert. Das ist der Grund weshalb runslot() diese Variable nicht nutzen kann, weil runslot() die Variable "liste" überhaupt nicht kennt.


Was Du nun versucht hast:

Du hast in MyClass mittels QListBox *liste; die Variable definiert. Jetzt versuchst Du die liste in main.cpp anzusprechen. Aber jetzt kennt main ja gar nicht mehr die Variable "liste", weil Du sie nur in MyClass definiert hast.

Das sind komplett verschiedene Gültigkeitsbereiche. Du kannst das nun folgendermaßen lösen:

Für den Fall, dass Du die Liste nur in MyClass benötigst gehst Du so vor:

Du deklarierst liste in MyClass, wie Du es schon gemacht hast. Jetzt musst Du aber liste noch belegen. Weil mit QListBox *liste hast Du lediglich einen Pointer auf ein Objekt QListBox erstellt. Im Konstruktor von MyClass kannst Du jetzt mit:

liste = new QListBox(win, "test");

die Variable liste auf ein neues Objekt vom Typ QListBox zeigen lassen. (Vorausgesetzt die Klasse MyClass kennt "win")

Falls Du die Liste auch außerhalb von MyClass benötigst musst Du die liste explizit von außen setzen. D.h.:

Du könntest entweder die Variable liste als public definieren und direkt darauf zugreifen, was aber unschön ist. Das sehe dann so aus:

public:
QListBox *liste;


Dann kannst Du von außerhalb auf liste zugreifen, mittels:

MyClass test;
test.liste = new QListBox(win, "test");

Oder eben:

MyClass *test = new MyClass();
test -> liste = new QListBox(win, "test");

Allerdings ist das direkte Zugreifen auf Variablen keine schöne Sache. Du könntest z.B. die Liste beim Konstruktor übergeben. D.h. Du schreibst einen Konstruktor für MyClass:

MyClass::MyClass(QListBox *myListBox) {
liste = myListBox;
}

(liste muss natürlich in MyClass vorhanden sein, wie Du es bereits gemacht hast)

Main sollte dann in etwa so aussehen:

QListBox *liste = new QListBox(win, "test");
MyClass *neuesObject = new MyClass(liste);

Jetzt kannst Du in runslot() auf die liste zugreifen.

Ich hoffe es hilft. Ich empfehle Dir außerdem, Dir mal ein C++ - Buch zuzulegen. Solche Dinge (Pointer, Gültigkeitsbereiche usw.) sind elementare C++ - Grundlagen und werden in fast jedem C++ - Buch ziemlich genau erklärt. Wenn Du das ganze nämlich verstanden hast, macht C++ programmieren gleich doppelt soviel Spaß, weil Du dann weißt, was Du da machst :)

Gruß

Mike
lori
Beiträge: 16
Registriert: 9. August 2004 13:06

Beitrag von lori »

Hi Mike!
danke für die ausführliche Erklärung - denke das bekomme ich dann morgen schon hin ;) ja, Du hast Recht - C++ Buch liegt hier rum, vielleicht hätte ich nicht gleich in der Mitte anfangen sollen zu lesen. Zwischen C++ und den Programmiersprachen die mir geläufig sind liegen eben doch Welten... danke nochmals.
Antworten