Seite 1 von 1

[gelöst] QRadioButton und Einbindung in interner Struktur

Verfasst: 24. Juli 2008 23:45
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

Verfasst: 25. Juli 2008 00:13
von Christian81
Man kann keine QObjet-Klassen in einer Liste/Vector/... speichern. Pointer auf QObjects gehen natürlich.

Verfasst: 9. August 2008 14:22
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

Verfasst: 10. August 2008 12:06
von pfid
Löscht du die eigentlich auch wieder?

Verfasst: 14. August 2008 15:45
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?