Seite 1 von 1
QGroupBox durch andere aktivieren
Verfasst: 17. Mai 2010 09:14
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
Verfasst: 17. Mai 2010 09:41
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?
Verfasst: 17. Mai 2010 10:07
von AuE
connecte doch das toggled(bool) mit dem setEnabled ....
Verfasst: 17. Mai 2010 10:14
von TSS
Du solltest auch irgendwo noch
aufrufen, damit das ganze auch angezeigt wird.
Verfasst: 17. Mai 2010 10:43
von franzf
TSS hat geschrieben:Du solltest auch irgendwo noch
aufrufen, damit das ganze auch angezeigt wird.
Ich hoffe doch stark, dass die groupBox in nem Layout liegt. Dann braucht es das show() nicht.
Verfasst: 17. Mai 2010 12:17
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:
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
Verfasst: 17. Mai 2010 12:53
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
Verfasst: 17. Mai 2010 13:22
von franzf
dev_prototyp hat geschrieben:-Auf was bezieht sich das? Ich hab die groupBox-en im header-file via (siehe unten) deklariert:
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...
Verfasst: 17. Mai 2010 15:42
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