QGroupBox durch andere aktivieren

Alles rund um die Programmierung mit Qt
Antworten
dev_prototyp
Beiträge: 3
Registriert: 16. Mai 2010 23:51

QGroupBox durch andere aktivieren

Beitrag von dev_prototyp »

Guten Tag,

mein Problem sieht folgender Maßen aus:

Ich möchte ein Programm schreiben, in dem durch das anwählen(checked(true)) einer QGroupBox eine andere QGroupBox aktiviert(enable(true)) wird.

Hier etwas Code:

Code: Alles auswählen

QGroupBox *Window::groupPlayer4()
{
    QGroupBox *groupBox = new QGroupBox(tr("Spieler 4"));    
    groupBox->setCheckable(true);
    groupBox->setChecked(false);
    groupBox->setEnabled(false);
- direkt in der Implementierung deaktiviert

Code: Alles auswählen

QObject::connect(groupPlayer3(), SIGNAL(clicked()),
                     this, SLOT(enablePlayer4()));
- im Konstruktor... bei SIGNAL habe ich auch schon toggled() getestet, jedoch ohne Erfolg

Code: Alles auswählen

void Window::enablePlayer4()
{
    Window::groupPlayer4()->setEnabled(true);
}
- und hier die Aktivierung... zeigt leider nichts an.

Ich habe nicht mit einem *.ui gearbeitet, lediglich in der Textoberfläche.

Danke für Antworten
Mit freundlichen Grüßen
dev_prototyp
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Du suchst nicht setEnabled() sondern setChecked().
Ich wäre mit deinem Konstrukt aber verdammt vorsichtig! groupPlayer<num>() erzeugt bei jedem Aufruf ein neues QGroupBox-Objekt. Wenn du zu einem späteren Zeitpunkt wieder Zugriff auf das Objekt haben willst, und dies über die Methode realisierst, bekommst du ein anderes Objekt zurück, als das welches du eigentlich haben willst.
Besser wäre eine allgemeine Methode QGroupBox* createPlayerGroupBox(const QString& title), die einfach nur ein GroupBox-Objekt erzeugt, dieses aber gleich in einen QVector packt, und natürlich auch in dein Layout einfügt. Der vector ist natürlich ein Element deiner Klasse.

Sind denn diese ganzen groupPlayer<num>()-Methoden static, weil du die so aufrufst?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

connecte doch das toggled(bool) mit dem setEnabled ....
TSS
Beiträge: 73
Registriert: 24. November 2009 15:40
Kontaktdaten:

Beitrag von TSS »

Du solltest auch irgendwo noch

Code: Alles auswählen

groupBox->show();
aufrufen, damit das ganze auch angezeigt wird.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

TSS hat geschrieben:Du solltest auch irgendwo noch

Code: Alles auswählen

groupBox->show();
aufrufen, damit das ganze auch angezeigt wird.
Ich hoffe doch stark, dass die groupBox in nem Layout liegt. Dann braucht es das show() nicht.
dev_prototyp
Beiträge: 3
Registriert: 16. Mai 2010 23:51

Beitrag von dev_prototyp »

klar hab ich alles in einem Layout. Es wird auch alles sauber angezeigt, wie ich es eben will, nur es verändert sich nix.

Also sollte ich die groupBox in einer eignen Klasse deklarieren, was dann wohl saubrer währe...?
Sind denn diese ganzen groupPlayer<num>()-Methoden static, weil du die so aufrufst?
-Auf was bezieht sich das? Ich hab die groupBox-en im header-file via (siehe unten) deklariert:

Code: Alles auswählen

QGroupBox *groupPlayer1();
connecte doch das toggled(bool) mit dem setEnabled ....
-Wie oben schon gesagt, bin ich diesen Weg bereits, leider erfolglos, abgelaufen...

Ich kann mir die Thematik leider erst gegen Abend anschaun, aber wenn euch noch was einfällt, immer ein Ohr offen.

Danke für die vielen und vor allem schnellen Antworten!

Mit freundlichen Grüßen
dev_prototyp
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

dev_prototyp hat geschrieben: -Auf was bezieht sich das?
Auf:

Code: Alles auswählen

void Window::enablePlayer4()
{
    Window::groupPlayer4()->setEnabled(true);
} 
dev_prototyp hat geschrieben:aber wenn euch noch was einfällt, immer ein Ohr offen.
- rückgabewert vom connect prüfen
- konsolenoutput anschauen
- den debugger anschmeissen und nachschauen wo es hängt
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

dev_prototyp hat geschrieben:-Auf was bezieht sich das? Ich hab die groupBox-en im header-file via (siehe unten) deklariert:

Code: Alles auswählen

QGroupBox *groupPlayer1();
Du deklarierst da keine GroupBox, sondern eine Methode, die eine QGroupBox zurückgibt. Wenn du auf deine GroupBoxen dann immer wieder nur über diese Methode zugreifst hast du wie gesagt ein Problem - mit jedem Aufruf kriegst du (bei deiner jetzigen Implementierung) ein anderes Objekt zurück!
Also sollte ich die groupBox in einer eignen Klasse deklarieren, was dann wohl saubrer währe...?
Nein.
kurz skizziert:

Code: Alles auswählen

class MainWindow : public QMainWindow {
  Q_OBJECT
  QVector<QGroupBox*> playerGroups;

  QGroupBox* createPlayerGroupBox(int number) {
    QGroupBox* group = new QGroupBox("Spieler " + QString::number(number+1), this);
    group->setCheckable(true);
    // usw.
    playerGroups.append(group);
    return group;
  }
};
Und immer wenn du eine neue playerGroupBox brauchst, erstellst du dir die mit dem createPlayerGroupBox.
Du könntest das ganze noch absichern, dass du abfrägst, wie viele GroupBoxen schon existieren, und wenn number < numGroupBoxes -> return vector.at(i).
Ansonsten erstellst du so viele GroupBoxen, bis number im vector liegen. Dann kannst du die create-Methode gleich als sichere Zugriffsmethode verwenden.

Code: Alles auswählen

class MainWindow : public QMainWindow {
  Q_OBJECT
  QVector<QGroupBox*> playerGroups;

  QGroupBox* createPlayerGroupBox(int number) {
    if(number < playerGroups.size()) return playerGroups.at(number);
    
    QGroupBox* group
    while(playerGroups.size() <= number) {
      group = new QGroupBox("Spieler " + QString::number(number+1), this);
      group->setCheckable(true);
      // usw.
      playerGroups.append(group);
      ++number;
    }
    return group;
  }
};
number ist bei beiden Beispielen der Index im Vector, nicht die Nummer auf dem Label!
connecte doch das toggled(bool) mit dem setEnabled ....
-Wie oben schon gesagt, bin ich diesen Weg bereits, leider erfolglos, abgelaufen...
Was wäre denn erfolgreich? Das ist mir noch nicht so ganz klar...
dev_prototyp
Beiträge: 3
Registriert: 16. Mai 2010 23:51

Beitrag von dev_prototyp »

Ok vielleicht habe ich mich unklar ausgedrückt. Erstmal danke für den code zu den GroupBoxen, werde ich so einfügen.

Also alles in allem sollen 4 GroupBoxen da sein. Die 1. und 2. ist fest(checkable(false)) und die 3. ist nur checkable. Die 4. jedoch soll erst anwählbar werden(checkable), wenn die 3. angewählt ist(checkable(true)).

So soll es aussehen, und da hing es immer an der 4., weil diese nicht enabled wurde.

Mit freundlichen Grüßen
dev_prototyp
Antworten