Seite 1 von 1

QToolButton erstellen und aufrufen

Verfasst: 19. Januar 2012 11:38
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

Re: QToolButton erstellen und aufrufen

Verfasst: 19. Januar 2012 12:08
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.

Re: QToolButton erstellen und aufrufen

Verfasst: 19. Januar 2012 14:30
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 ?

Re: QToolButton erstellen und aufrufen

Verfasst: 19. Januar 2012 14:44
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.

Re: QToolButton erstellen und aufrufen

Verfasst: 19. Januar 2012 15:38
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'

Re: QToolButton erstellen und aufrufen

Verfasst: 19. Januar 2012 15:50
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++.

Re: QToolButton erstellen und aufrufen

Verfasst: 19. Januar 2012 16:20
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.

Re: QToolButton erstellen und aufrufen

Verfasst: 19. Januar 2012 18:18
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 :/