QToolButton erstellen und aufrufen

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
VarusBiker
Beiträge: 4
Registriert: 10. Januar 2012 10:30

QToolButton erstellen und aufrufen

Beitrag von VarusBiker »

Hallo,

meine qt Kenntnisse sind noch sehr beschränkt. Ich hänge gerade an einem simplem Problem. Ich will beliebig viele QToolButtons beim klick auf ein anderen button erzeugen. Imgrunde funktioniert das erzeugen auch schon.

Code: Alles auswählen

QToolButton *button1 = new QToolButton();
    this->layout()->addWidget(button1);
    button1->setGeometry(50, 30, 25, 30);
    button1->setCheckable(1);
Auf diese weise kann ich EIN Button mit dem Namen button1 problemlos erzeugen und auch ansprechen:

Code: Alles auswählen

if (ui->button1->isChecked())  
aber jetzt hänge ich. ich will jetzt mehrere buttons erzeugen lassen und ansprechen.

Ich hatte auch folgende Grundidee bereits:

Code: Alles auswählen

int var_buttonID;
    var_buttonID += 1;
    char buttonID[]="button_01";
    sprintf(buttonID,"button_%d",var_buttonID);
    newUnit->setObjectName(buttonID);
Ich erzeuge ganz simpel bei jedem button einen anderen namen.
diese Idee scheitert aber schlicht daran, dass qt bei der abfrage ui->button_1->isChecked() dies als name nicht akzeptiert.



Mir fehlt hier leider Grundwissen über die Mechanik von qt - allerdings arbeite ich gerade an ein nicht unwichtiges Projekt und hänge zeitlich hinterher. Daher hoffe ich das mir ein User hier vieleicht eine simple und schnelle Lösung für mein problem kennt.


Vielen Dank im vorraus,

mit freundliche Grüßen VarusBiker
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QToolButton erstellen und aufrufen

Beitrag von franzf »

Zu deinem oberen Code:
ui->button1 ist ein anderes Objekt als der button1, den du im ersten Codefragment erzeugst. Auch wenn der Code funktioniert, tut er nicht das was du willst.
Die Erzeugung deines objectNames ist viel zu kompliziert. Verwende QString statt der C-Methoden.

ui->button_1 ist halt ein Objekt, das button_1 dessen Name. Ein Objektname ist etwas, was nur den Compiler interessiert, der kann dann daraus machen was er will. Insbesondere kannst du nicht zur Laufzeit mit einem String einen Objektnamen ansprechen. Dafür gibt es in Qt eben setObjectName() + findChild().
Alternativ kannst du auch selber eine QMap<QString,QToolButton*> anlegen, um dort die Name<>Objekt-Paare zu verwalten.
VarusBiker
Beiträge: 4
Registriert: 10. Januar 2012 10:30

Re: QToolButton erstellen und aufrufen

Beitrag von VarusBiker »

Danke für die schnelle Antwort.Ich muss gestehen - ganz verstehen tu ich deine Lösung aber noch nicht.

Bevor ich in stundenlanger suche im google versinke - macht es dir etwas aus, die 3 Ansätze etwas mehr zu erläutern ?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QToolButton erstellen und aufrufen

Beitrag von franzf »

Wieso 3 Ansätze? Den einen (setObjectName) hast du schon selber begonnen. Verstehst du die Doku zu QMap nicht?
Der zweite wäre der mit QMap.

Viel zu suchen gibt es da eigentlich nicht.
Doku -> QObject -> findChild(), da steht eigentlich alles, was du wissen musst.
Jetzt brauchst du nur noch ein passendes parent-Objekt für die Suche -> sollte die Klasse sein, die deine Buttons hält (MainWindow?)

Für ein komplettes Beispiel brauch ich auch 20 Minuten (Coden, erklären, posten...), und am Ende hast du nichts dabei gelernt.
Versuch doch, dich ein wenig einzuarbeiten. Wenn du irgendwo hängst, poste deinen Code, dann helf ich gern weiter.
VarusBiker
Beiträge: 4
Registriert: 10. Januar 2012 10:30

Re: QToolButton erstellen und aufrufen

Beitrag von VarusBiker »

okay, was ich jetzt versuche ist :

Code: Alles auswählen

*PointHelper->findChild<QToolButton *>("SCHEMAXY");
    if (ui->*PointHelper->isChecked())
dazu

Code: Alles auswählen

float *PointHelper;
ich versteh gerade nicht warum das ein Fehler ergibt:
Fehler:request for member 'findChild<QToolButton*>' in '* PointHelper', which is of non-class type 'float'
und
Fehler:request for member 'isChecked' in '* PointHelper', which is of non-class type 'float'
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QToolButton erstellen und aufrufen

Beitrag von franzf »

1) float ist kein QObject! Das ist ein primitives Datentyp, der selber gar keine Methoden anbietet.
2) Warum "float*"? Die ganzen primitiven Datentypen (float/int/...) sind so schnell erzeugt und kopiert, da ist der Umweg über den Heap eher bremsend.
3) Hat das leider gar nichts mehr mit Qt zu tun :( Dir fehlen noch einige Grundlagen in C++.
VarusBiker
Beiträge: 4
Registriert: 10. Januar 2012 10:30

Re: QToolButton erstellen und aufrufen

Beitrag von VarusBiker »

franzf hat geschrieben:3) Hat das leider gar nichts mehr mit Qt zu tun :( Dir fehlen noch einige Grundlagen in C++.
so viel dazu.....
Wenn du irgendwo hängst, poste deinen Code, dann helf ich gern weiter.
Ich bitte mich zu entschuldigen, aber damit hast du mir nicht gerade weitergeholfen.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QToolButton erstellen und aufrufen

Beitrag von franzf »

VarusBiker hat geschrieben:
franzf hat geschrieben:3) Hat das leider gar nichts mehr mit Qt zu tun :( Dir fehlen noch einige Grundlagen in C++.
so viel dazu.....
Was erwartest du?
findChild ist eine Methode von QObject (hatte ich geschrieben), du wendest es auf ein float an (float* dereferenziert + operator->).
Auf den Fehler in deinem vorhergehenden Versuch hatte ich dich auch aufmerksam gemacht:
1) ui->button1
2) button1
button1 in 1) ist ein Member von ui, button1 in 2) ist ein völlig neues Objekt. Beide sind trotz ihrem gleichen Name in einem vollkommen anderen Gültigkeitsbereich.
Wenn du irgendwo hängst, poste deinen Code, dann helf ich gern weiter.
Ich bitte mich zu entschuldigen, aber damit hast du mir nicht gerade weitergeholfen.
Wie soll ich dir denn helfen? Dir erklären, was Klassen oder Objekte sind? Was der Unterschied zwischen float und QObject ist? Wie Vererbung funktioniert? Was der Unterschied zwischen HEAP und STACK ist? Wie ich entsprechend auf Objekte zugreife?
Das alles sollte bekannt sein, wenn du dich an ein so auf Objektorientierung ausgreichtetes Framework wie Qt wagst. Ist es das nicht, bist du ziemlich verloren :/
Antworten