Seite 1 von 1

[gelöst] QGroupBox mit QRadioButtons Schrift übermalt sich

Verfasst: 20. August 2008 02:17
von cooky1976
Hallo,

ich habe eine abgeleitete QGroupbox in der ich den Klassenmember QVBoxLayout mit QRadioButtons fülle. Später werden die zur Laufzeit aktualisiert. Aktuell löse ich das mit QPushButtons. Hierzu habe ich die QGroupBoxKlasse wiederum in eine TestWidget-Klasse integriert, die die QGroupBox und noch ein QPlainTextEdit und 2 PushButtons beinhaltet.
Immer wenn ich eine neue Konfiguration in mein textEdit eingebe, sollen die QRadioButtons neu generiert werden. Hierzu lösche ich die alten, die ich in einer internen Struktur speichere und füge die neuen zu meinem QVBoxLayout hinzu.
QVBoyLayout wird im Konstruktor initialisiert.

Hier der relevante Code (Teil aus einer Funktion, gekürzt):

Code: Alles auswählen

	//_buttons ist die interne Struktur in der ich die QPushbuttons halte
//_altern QMap der neuen QPushButtons
for (int i = 0; i < _buttons->size(); i++) {
		vBox->removeWidget(_buttons->value(i));
		disconnect(_buttons->value(i), SIGNAL(clicked()),
					this, SLOT(alternativeSelected()));
	}

	_buttons->clear();
	
	QMapIterator<QString, QString> i(*_altern);
	while (i.hasNext()) {
		i.next();
		QRadioButton *radio = new QRadioButton(i.value());
		_buttons->append(radio);
		vBox->addWidget(radio);
		connect(radio, SIGNAL(clicked()),
				this, SLOT(alternativeSelected()));
	}
	repaint();
Ich habe auch schon bei meinem TestWidget am Schluß des RadioButton-Erneuern-Slots ein repaint bzw. update eingebaut, aber selbst das bringt nichts.

Hat jemand bitte einen Tipp?

Danke

Alexander

PS: So sieht das aus: http://qt.venus22.net/alternatives.jpg

Verfasst: 20. August 2008 09:09
von Brunolein
Sieh mal unter "Problem beim Löschen der Kinder eines Widgets" (http://qtforum.de/forum/viewtopic.php?t ... 7d5b2e2a39) nach. Ich glaube unsere Probleme sind sehr ähnlich.

Verfasst: 20. August 2008 10:56
von cooky1976
Hallo,

danke für die Antwort. Ich habe mir das Problem nochmals angesehen und habe gesehen, dass Du Recht hast. Allerdings ist mir das warum immer noch schleierhaft.
In meinem QVcoxLayout vBox sind doch meine QRadiobuttons eingebunden. Nach meiner Löschaktion ist das Layout auch leer, was ich bereits mit der Methode vBox->count() überprüft habe (zur Laufzeit). Also dürfte eigentlich der Button nicht mehr angezeigt werden.
Warum aber wird er erst dann nicht mehr angezeigt, wenn ich
_buttons->value(i)->deleteLater();
ausführe??
Das Widget an sich, in dem das QVBoxLayout eingebunden ist, hat keine Referenz auf den Button, der Button wurde aus dem Layout genommen. Wo ist also noch die Referenz, die den Button anzeigen lässt??

Danke

Alexander

Verfasst: 20. August 2008 11:13
von CaptnChaos
Aus den Listen der GroupBox und des Layouts mögen die buttons ja verschwunden sein. deshalb liegt das object trotzdem noch irgendwo im speicher, da es dort nicht per delete gelöscht wurde.

Verfasst: 20. August 2008 11:28
von cooky1976
Dass es im Speicher ist und dass ich da einen Fehler gemacht habe, das nicht zum Löschen freizugeben, ist mir klar.
Aber warum werden die "alten" Buttons bei mir angezeigt, die ja in keiner Liste des QVBoyLayouts mehr sein dürften?

Verfasst: 20. August 2008 11:51
von CaptnChaos
Das Layout ist nicht zum zeichnen zuständig. Eben nur für das Layout..
Du musst schon die buttons selbst löschen. wenn du alles aus dem QGroupBox löschen willst, nimm diese funktion:

Code: Alles auswählen

void deleteAllChildren(QWidget *parent)
{
	foreach(QObject *o, parent->children())
		if(o->isWidgetType())
		{
			QWidget *child = qobject_cast<QWidget*>(o);
			child->close();
			child->deleteLater();
		}
}

Verfasst: 20. August 2008 12:18
von upsala
Warum child->close()? Was versprichst du dir in diesem Fall davon?

Verfasst: 20. August 2008 12:24
von CaptnChaos
das das child gelöscht wird?
eher kann ich mir deleteLater sparen...

Verfasst: 20. August 2008 13:05
von cooky1976
Wie schrieb man, als ich noch jung war ..... RTFM .... :
QVBoxLayout Class Reference:
First, we create the widgets we want in the layout. Then, we create the QVBoxLayout object and add the widgets into the layout. Finally, we call QWidget::setLayout() to install the QVBoxLayout object onto the widget. At that point, the widgets in the layout are reparented to have window as their parent.
Und damit klappt es auch mit den Kindern ;-)