[gelöst] QRadioButton und Einbindung in interner Struktur

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

[gelöst] QRadioButton und Einbindung in interner Struktur

Beitrag von cooky1976 »

Hallo,

ich will kurz ausholen um zu erklären, was ich hier vorhabe. Die Klasse Teil einer Kontroloberfläche werden, mit best. techn. Geräte überwacht werden können. Diese Geräte geben von Zeit zu Zeit über XML-Handlungsalternativen, die man wählen kann oder nicht, das heisst, ich möchte eine RadioButtonListe mit den Alternativen und immer, wenn es eine neue Auswahl gibt, möchte ich diese neu aufbauen. Die RadioButtons an sich will ich in einen internen Container packen, da ich bei einem Klick ja wissen will, worauf geklickt wurde und von dem geklickten RadioButton den Text brauche.

Mein Headerfile:

Code: Alles auswählen

#include <QtGui>

class ReMoCoAlternatives : public QGroupBox 
{
	Q_OBJECT

public:
	ReMoCoAlternatives(QWidget *parent = 0);
	void newAlternatives(QVector<QString> alternatives);

signals:
	void loadAlternative(const QString &);

public slots:
	void alternativeSelected();

private:
	QVector<QRadioButton> *_itemsAM;
	QVBoxLayout *vBox;
};
Die Klasse an sich:

Code: Alles auswählen

#include "ReMoCoAlternatives.h"

ReMoCoAlternatives::ReMoCoAlternatives(QWidget *parent)
: QGroupBox(parent)
{
	setTitle(tr("Alternatives"));
}
void ReMoCoAlternatives::newAlternatives(QVector<QString> alternatives)
{
	vBox = new QVBoxLayout;

	for (int i = 0; i < _itemsAM->size(); i++) {
		disconnect(_itemsAM->value(i), SIGNAL(clicked()),
					this, SLOT(alternativeSelected()));
	}

	_itemsAM->clear();

	for (int i = 0; i < alternatives.size();i++) {
		QRadioButton radio(alternatives.value(i));
		_itemsAM << radio;
		vBox->addWidget(&radio);
		connect(&radio, SIGNAL(clicked()),
				this, SLOT(alternativeSelected()));
	}
	vBox->addStretch(1);
	setLayout(vBox);
	show();
}
void ReMoCoAlternatives::alternativeSelected()
{
	QString commandAlternative;
	for (int i = 0; i < _itemsAM->size(); i++) {
		if (_itemsAM->value(i).isChecked()) {
			commandAlternative = _itemsAM->value(i).text();
		}
		_itemsAM->value(i).setEnabled(false);
	}
	emit loadAlternative(commandAlternative);
}
Die Anforderungen an die Klasse:
- das RadioButton-Objekt soll nur einmal vorhanden sein, also eigentlich per Pointer, das hat aber nicht zum gewünschten Ergebnis geführt
Es knallt bei mir immer bei der Hinzufüge-Klasse, egal ob ich von QRadioButton-Pointern ausgehe (QradioButton *radio = new QradioButton(alternatives.value(i));), oder aber von einem QRadioButton-Objekt.
Der Compiler steigt immer bei MS VS2008 bei dem append aus, wobei ich mit dem append auch nicht wirklich glücklich bin, da das Objekt kopiert wird. Die QList kopiert aber auch als Container.

Meine Fragen:
- Habe ich einen falschen Denkansatz?
- Welchen Container kann ich verwenden, so dass ich nur ein Objekt in meinem internen Container und in dem Layout habe
- wie bekomme ich den Compiler beim aktuellen Ansatz dazu, dass er durchkompiliert?


Aller, aller besten Dank an alle

Alexander
Zuletzt geändert von cooky1976 am 9. August 2008 18:06, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Man kann keine QObjet-Klassen in einer Liste/Vector/... speichern. Pointer auf QObjects gehen natürlich.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
cooky1976
Beiträge: 76
Registriert: 24. Januar 2008 00:19

Beitrag von cooky1976 »

Aller, aller besten Dank. Und ich bin wahrlich Tage dran gesessen, bin schier verzweifelt und habe mir die letzten Haare ausgerauft. Für alle, die es vielleicht nicht ganz nachvollziehen können, hier der funktionierende Code:

Code: Alles auswählen

#include <QtGui>

class ReMoCoAlternatives : public QGroupBox 
{
	Q_OBJECT

public:
	ReMoCoAlternatives(QWidget *parent = 0);
	void newAlternatives(QVector<QString> alternatives);

signals:
	void loadAlternative(const QString &);

public slots:
	void alternativeSelected();

private:
	QVector<QRadioButton*> *_itemsAM;
	QVBoxLayout *vBox;
};

Code: Alles auswählen

#include "ReMoCoAlternatives.h"

ReMoCoAlternatives::ReMoCoAlternatives(QWidget *parent)
: QGroupBox(parent)
{
	setTitle(tr("Alternatives"));
}
void ReMoCoAlternatives::newAlternatives(QVector<QString> alternatives)
{
	vBox = new QVBoxLayout;

	for (int i = 0; i < _itemsAM->size(); i++) {
		disconnect(_itemsAM->value(i), SIGNAL(clicked()),
					this, SLOT(alternativeSelected()));
	}

	_itemsAM->clear();

	for (int i = 0; i < alternatives.size();i++) {
		QRadioButton *radio = new QRadioButton(alternatives.value(i));
		_itemsAM->append(radio);
		vBox->addWidget(radio);
		connect(radio, SIGNAL(clicked()),
				this, SLOT(alternativeSelected()));
	}
	vBox->addStretch(1);
	setLayout(vBox);
	show();
}
void ReMoCoAlternatives::alternativeSelected()
{
	QString commandAlternative;
	for (int i = 0; i < _itemsAM->size(); i++) {
		if (_itemsAM->value(i)->isChecked()) {
			commandAlternative = _itemsAM->value(i)->text();
		}
		_itemsAM->value(i)->setEnabled(false);
	}
	emit loadAlternative(commandAlternative);
}
Gute Nacht

Alexander
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

Löscht du die eigentlich auch wieder?
cooky1976
Beiträge: 76
Registriert: 24. Januar 2008 00:19

Beitrag von cooky1976 »

Ich denke, Du meinst mit die die Radiobuttons.

Nein, ich lösche die nicht, da ich der Meinung bin, dass QT einen Mechanismus bereit stellt, der die Objekte löscht, wenn es keine Verweise mehr auf diese gibt. Und mein

Code: Alles auswählen

 _itemsAM->clear();
löscht ja die Verweise. Habe ich hier einen Denkfehler?
Antworten