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

Alles rund um die Programmierung mit Qt
Antworten
cooky1976
Beiträge: 76
Registriert: 24. Januar 2008 00:19

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

Beitrag 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
Zuletzt geändert von cooky1976 am 20. August 2008 13:20, insgesamt 1-mal geändert.
Brunolein
Beiträge: 4
Registriert: 17. August 2008 15:56

Beitrag 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.
cooky1976
Beiträge: 76
Registriert: 24. Januar 2008 00:19

Beitrag 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
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag 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.
cooky1976
Beiträge: 76
Registriert: 24. Januar 2008 00:19

Beitrag 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?
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag 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();
		}
}
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Warum child->close()? Was versprichst du dir in diesem Fall davon?
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag von CaptnChaos »

das das child gelöscht wird?
eher kann ich mir deleteLater sparen...
cooky1976
Beiträge: 76
Registriert: 24. Januar 2008 00:19

Beitrag 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 ;-)
Antworten