[gelöst] Anz. von QPushButtons abhängig von bestimmtem Wert

Alles rund um die Programmierung mit Qt
Antworten
dani.80
Beiträge: 31
Registriert: 9. Mai 2005 14:52

[gelöst] Anz. von QPushButtons abhängig von bestimmtem Wert

Beitrag von dani.80 »

Hallo,
ich stehe gerade ein bisschen auf em Schlauch. Wie könnte man folgendes umsetzen?
Ich habe ein Widget und möchte in Abhängigkeit eines bestimmten int-Wertes diese Anzahl an QPushButtons dem LAyout des Widgets hinzufügen. Jeder dieser QPushButtons soll ein eigenes Bild erhalten (lese ich aus einen Array aus).
Wenn man nun auf einen Button klickt, soll das Bild, das auf dem Button ist, in vergrößerter Form in einem schon vorher definierten Label ercheinen.

Wo ich hängen bleibe ist, wie man am besten die verschiedenen PuskButtons erzeugt, also mit unterschiedlichen Bildern, und das eben dynamisch in Abhängigkeit von einem zunächst unbekannten Wert.
Und das andere ist, wie man am besten die Buttons mit Signal und Slot verknüpft. Mach ich das über ne ButtonGroup? Und dann brauch ich ja ein Signal, das mir vom jeweiligen Button das Bild liefert und es dem Slot übergibt, damit der es im Label groß darstellen kann, oder?
Wie man ein solches Signal baut und den zugehörigen Slot ist mir auch noch nicht ganz klar. Ich muss diesen ja dann Parameter uebergeben, oder? Also, dass man irgendwie sagt, bei clicked() des Buttons, soll sein Bild dem Slot übergeben werden.

Freue mich über jede Hilfestellung. Wenn ich Code dazu habe, werde ich ihn auch noch posten.
Danke,
Grüße,
Dani
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Der Wert ist unbekannt? Wenn du die Werte in eine Liste (Array) fügst weisst du doch genau wieviele enthalten sind?

Code: Alles auswählen

for ( uint x = 0; x < list.size(); ++x ) {

  btn = new QPushButton( this );
  btn -> setIconSet( ScaleIcon( "HIER" ) );
  connect ( btn, SIGNAL( clicked() ), this, SLOT( slotShowImg() ) );
}

void Klasse:slotShowImg() {

  QWidget *curWidget = qApp -> focusWidget();
  if ( curWidget -> inherits( "QPushButton" ) ) {

      QPushButton *btn = ( QPushButton * )curWidget;
      label -> setPixmap( btn -> iconSet() );
    }
}
Geht auch noch viel viel umständlicher, aber das war mir jetzt ein wenig zu aufwendig. Du kannst es auch direkt aus einer Liste heraus machen, oder so.
dani.80
Beiträge: 31
Registriert: 9. Mai 2005 14:52

Beitrag von dani.80 »

Mit "der Wert ist unbekannt" wollte ich sagen, dass zur der Zeit, wo das Haupt-Widget erzeigt wird noch nicht beaknnt ist, wieviele dieser Buttons angezeigt werden sollen, denn diese Liste von der ich gesprochen habe wird erst während der Laufzeit des Programms erzeugt.
Danke schonmal für deine Antwort. Werd mir das mal anschauen, und mich ggf. nochmal melden :D
dani.80
Beiträge: 31
Registriert: 9. Mai 2005 14:52

Beitrag von dani.80 »

Hallo,
hab nochmal ne Frage:
Das mit den Button funktioniert wunderbar, aber dass deren Bild dann im Label angezeigt wird noch nicht. Das liegt wohl am Slot:
Die IF-Abfrage ergibt kein TRUE, deswegen wird es nicht ausgefuehrt.
Kannst du mir die Zeilen vielleicht nochmal kurz erklären:

QWidget *curWidget = qApp -> focusWidget();

if ( curWidget -> inherits( "QPushButton" ) ) {
//Hier wird das Widget, auf das der Focus gesetzt ist in einen
//QPushButton "umgewandelt", oder? Muss man dann irgendwann vorher
//mal den Focus auf den entsprechenden Button setzen?
QPushButton *btn = ( QPushButton * )curWidget;

Danke,
viele Grüße,
Dani
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Also das curWidget ist das gerade unter dem Focus befindlichen Widget, und der wird bei Qt automatisch gesetzt, sei es mit dem Keyboard oder mit der Maus.

Das if ( curWidget -> inherits( "QPushButton" ) ) { fragt ab ob es ein Type QPushButton ist und dann wird es in den weiteren Zeilen in einen QPushButton umgewandelt.

Wenn es an den SLOTs liegt, bekommst du auf dem stdout einen Fehlerhinweis, das das SIGNAL oder der SLOT nicht vohanden ist.
dani.80
Beiträge: 31
Registriert: 9. Mai 2005 14:52

Beitrag von dani.80 »

Aber ich habe versucht, in der If-Abfrage mir mit cout etwas ausgeben zu lassen, aber da wird nichts ausgegeben. Also müsste es an der If-Abfrage liegen, also dass er da gar nicht erst reinkommt, oder?
Naja, schau mir das nochmal an. HAst mir auf jeden Fall weitergeholfen. Danke
dani.80
Beiträge: 31
Registriert: 9. Mai 2005 14:52

Beitrag von dani.80 »

Also, ich habe es mir nochmal angeschaut. Das Problem ist wohl, dass der Aufruf:
QWidget *curWidget = qApp -> focusWidget();
das falsche Widget liefert.
In meinem Layout befindet sich noch ein Slider.
Auf diesen ist der Focus wohl gesetzt, obwohl ich den PushButton betätige (hab ich gesehen durch setzen der Hintergrundfarbe des Widgets curWidget).

HAst du ne Idee, wieso mit focusWidget(); das falsche Widget geliefert wird?
dani.80
Beiträge: 31
Registriert: 9. Mai 2005 14:52

Beitrag von dani.80 »

Ich habe jetzt bei den Buttons ->setFocusPolicy(QWidget::ClickFocus) gesetzt und es funktioniert.

Danke für die Tips.
Antworten