Problem mit connect()

Alles rund um die Programmierung mit Qt
Antworten
twist
Beiträge: 7
Registriert: 19. Februar 2007 14:24

Problem mit connect()

Beitrag von twist »

Hallo,

Ich habe da ein Problem mit der connect()-Methode um Signale mit slots zu verbinden.

Habe eine ConfDialog Klasse mit einer QListBox und einem QTabWidget.
Dieses TabWidget hat 3 seiten und wird für jeden eintrag in der ListBox erneuert. Somit hat jeder Eintrag in der ListBox seine eigenen drei seiten.
Die 3 Seiten pro Eintrag werden in einer DatenContainer Klasse in form eines TabContainers, welcher alle 3 seiten in form einer Confframe klasse beherbergt.
die 3 seiten in diesem Tabcontainer werden über einen Tabcreator Klasse erstellt. die Tabcreator Klasse besteht aus einer Basisklasse, welche die allgemeinen Konfigurationsmittel erstellt, und den abgeleiteten Klassen die spezielen Konfigurationsmittel erstellt.
Zu den allgemeinen Konfigurationsmittel,welche die Basisklasse beinhaltet, gehört eine QComboBox, in welcher der und andere Typen der abgeleiteten klasse steht, welche wiederrum die Spezielen Konfigurationsmittel beinhaltet.
wird nun die Combox der Basis Klasse geändert, soll nun das Signal highlighted(const QString &string) einen slot (editFrame(const QString &devName);) in der TabContainer Klasse auslösen.
damit der neue spezielle Frame erstellt wird.
die connect Methode führe ich im constructor des TabContainers, nachdem die einzelnen confFrames erstellt wurden aus.
Den Zeiger auf die jeweilig QComboBox lass ich mir über eine Methode des jeweiligen confFrames zurück liefern.
Aber leider gibt connect() immer false zurück.
ich hab aber kein schimmer warum!!!

Die Parametertypen von Signal und slot sind gleich.


TabContainer Klasse .h

Code: Alles auswählen

#include "qtinclude.h"
#include "cconfframe.h"
#include "cconfframecreator.h"
#include "cserialconfcreator.h"
#include "cdatabaseconfcreator.h"
#include "cdevicecont.h"
#include <qobject.h>


class CConfContainer : virtual public QObject
{
Q_OBJECT
public:
	CConfContainer(QString sourceDevName,QString targetDevName,QMap<QString,QWidget*> parents);

    ~CConfContainer();
    bool isReady();
    CDeviceCont* getDevice(bool source);
    void showAll();
    void hideAll();
    QWidget* getSourceFirstWidget();
    QWidget* getTargetFirstWidget();
    QWidget* getDataFirstWidget();
public slots:
	void	editSourceFrame(const QString devName);
	void	editTargetFrame(const QString devName);
		
protected:
    bool m_Ready;
    CConfFrame* m_Data;
    CConfFrame* m_Source;
    CConfFrame* m_Target;
	QMap<QString,QWidget*> m_Parents;
    QMap<QString,CConfFrameCreator*> m_DevConfCreatMap;
};


TabContainer Klasse .cpp

Code: Alles auswählen

#include "cconfcontainer.h"

CConfContainer::CConfContainer(QString sourceDevName,QString targetDevName,QMap<QString,QWidget*> parents)
	:m_Source(0),m_Target(0)
{
	m_Parents=parents;
	m_DevConfCreatMap.insert(QString("Serial"),new CSerialConfCreator());
	m_DevConfCreatMap.insert(QString("DataBase"),new CDataBaseConfCreator());
	CConfFrameCreator dataCreator;
	m_Data=dataCreator.createDataConf(parents[QString("Data")]);
	m_Source=m_DevConfCreatMap[sourceDevName]->createConf(parents[QString("Source")]);
	m_Target=m_DevConfCreatMap[targetDevName]->createConf(parents[QString("Target")]);
	m_Source->addDevNames( m_DevConfCreatMap.keys());
	m_Target->addDevNames( m_DevConfCreatMap.keys());
	bool test;
	if(m_Source->getDevCombo()!=NULL) {
//Problemstelle Connect gibt nur false wieder!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	if(!connect(m_Source->getDevCombo(),SIGNAL(highlighted(const QString)),this,SLOT(editSourceFrame(const QString)))) {
			QMessageBox::warning(NULL,tr("fehler"),tr("Konnte Signale nicht verbinden!"),QMessageBox::Yes,QMessageBox::No);
		}
		test=true;
	}else {
		test=false;
	}
	
	if(m_Target->getDevCombo()!=NULL) {
		if(!connect(m_Target->getDevCombo(),SIGNAL(highlighted(const QString)),this,SLOT(editTargetFrame(const QString)))){
			QMessageBox::warning(NULL,tr("fehler"),tr("Konnte Signale nicht verbinden!"),QMessageBox::Yes,QMessageBox::No);
		}
		test=true;
	}else {
		test=false;
	}
	if(!test) {
		QMessageBox::warning(NULL,tr("fehler"),tr("devCombo= Null"),QMessageBox::Yes,QMessageBox::No);
	}
}


CConfContainer::~CConfContainer()
{
}


#include "cconfcontainer.moc"


/*!
    \fn CConfContainer::isReady()
 */
bool CConfContainer::isReady()
{
	return m_Ready;
}

/*!
    \fn CConfContainer::getDevice(bool source)
 */
CDeviceCont* CConfContainer::getDevice(bool source)
{
	if(source) {
		return m_Source->getDeviceCont();
	}else {
		return m_Target->getDeviceCont();
	}
}

/*!
    \fn CConfContainer::showAll()
 */
void CConfContainer::showAll()
{
	m_Source->widgetShow();
	m_Target->widgetShow();
	m_Data->widgetShow();
}

// PUBLIC SLOTS:

/*!
 	\fn CConfContainer::editSourceFrame(QString devName)
 */
void CConfContainer::editSourceFrame(const QString devName) {
	delete(m_Source);
	m_Source=m_DevConfCreatMap[devName]->createConf(m_Parents[QString("Source")]);	
}


/*!
 	\fn CConfContainer::editTargetFrame(QString devName)
 */
void CConfContainer::editTargetFrame(const QString devName ) {
	delete(m_Target);
	m_Target=m_DevConfCreatMap[devName]->createConf(m_Parents[QString("Target")]);	
}


/*!
    \fn CConfContainer::hideAll()
 */
void CConfContainer::hideAll()
{
	m_Source->widgetHide();
	m_Target->widgetHide();
	m_Data->widgetHide();
}


/*!
    \fn CConfContainer::getSourceFirstWidget()
 */
QWidget* CConfContainer::getSourceFirstWidget()
{
	return m_Source->getFirst();
}


/*!
    \fn CConfContainer::getTargetFirstWidget()
 */
QWidget* CConfContainer::getTargetFirstWidget()
{
	return m_Target->getFirst();
}


/*!
    \fn CConfContainer::getDataFirstWidget()
 */
QWidget* CConfContainer::getDataFirstWidget()
{
	return m_Data->getFirst();
}
Basis Klasse confFrameCreator .h

Code: Alles auswählen

#include <qframe.h>
#include <qlabel.h>
#include <qwidget.h>
#include <qlineedit.h>
#include <qcombobox.h>
#include <qcheckbox.h>
#include <qradiobutton.h>
#include <qobject.h>
#include "cconfframe.h"


class CConfFrameCreator : virtual public QObject
{
	Q_OBJECT
public:
    CConfFrameCreator();

    ~CConfFrameCreator();
	virtual CConfFrame* createDataConf(QWidget* parent=0);
	virtual CConfFrame* createConf(QWidget* parent=0,CConfFrame* confFrame=0);


	

protected:
    QWidget* m_Parent;
};


Basis Klasse confFrameCreator .cpp

Code: Alles auswählen

#include "cconfcontainer.h"
#include "cconfframecreator.h"

CConfFrameCreator::CConfFrameCreator()
{
}


CConfFrameCreator::~CConfFrameCreator()
{
}

CConfFrame* CConfFrameCreator::createConf(QWidget* parent,CConfFrame* confFrame)
{
	QGroupBox* tabBox=new QGroupBox(parent);
	confFrame->addTabBox( tabBox);
	confFrame->addFrame( QString("tabBox"),tabBox,parent);
	QVBoxLayout* tabLayoutV=new QVBoxLayout(tabBox);
	confFrame->addTabLayoutV( tabLayoutV);
	QHBoxLayout* devComboHLay=new QHBoxLayout(tabBox);
	confFrame->addDevComboHLay( devComboHLay);
	QLabel* labDevCo=new QLabel("Device : ",tabBox);
	labDevCo->setMaximumSize(200,30);
	confFrame->addFrame( QString("labDevCo"),labDevCo);	
	QComboBox* devCombo= new QComboBox(tabBox);
	devCombo->setMaximumSize(200,30);
	confFrame->addFrame( QString("m_DevCombo"),devCombo);
	confFrame->addDevCombo( devCombo);
	QGroupBox* confGroupBox=new QGroupBox(tabBox);
	confFrame->addFrame( QString("m_ConfGroubBox"),confGroupBox);
	m_Parent=confGroupBox;
	confFrame->addConfGroupBox( confGroupBox);
	tabLayoutV->addLayout(devComboHLay);
	devComboHLay->addWidget(labDevCo);
	devComboHLay->addWidget(devCombo);
	tabLayoutV->addWidget(confGroupBox);
	return confFrame;
}

CConfFrame* CConfFrameCreator::createDataConf(QWidget* parent) {
	CConfFrame* dataFrame=new CConfFrame();
	QGroupBox* tabBox=new QGroupBox(parent);
	dataFrame->addFrame( QString("tabBox"),tabBox);
	dataFrame->addTabBox( tabBox);
	QVBoxLayout* tabLayoutV=new QVBoxLayout(tabBox);
	dataFrame->addTabLayoutV( tabLayoutV);
	QHBoxLayout* devComboHLay=new QHBoxLayout(tabBox);
	dataFrame->addDevComboHLay( devComboHLay);
	tabLayoutV->addLayout(devComboHLay);	
	devComboHLay->addWidget(new QLabel("Datapackage size : ",tabBox));
	QLineEdit* dataPackageSize=new QLineEdit(tabBox);
	dataPackageSize->setMaximumSize(200,30);
	devComboHLay->addWidget(dataPackageSize);
	QHBoxLayout* hLay=new QHBoxLayout(tabBox);
	dataFrame->addConfHLay( hLay);
	tabLayoutV->addLayout(hLay);
	hLay->addWidget(new QLabel("Status Range :   from:",tabBox));
	QSpinBox* statusStart=new QSpinBox(tabBox);
	statusStart->setMaximumSize(60,30);
	dataFrame->addStatusStart( statusStart);
	hLay->addWidget(statusStart);
	QLabel* labTo=new QLabel("to",tabBox);
	labTo->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
	hLay->addWidget(labTo);
	QSpinBox* statusEnd=new QSpinBox(tabBox);
	statusEnd->setMaximumSize(60,30);
	dataFrame->addStatusEnd( statusEnd);
	hLay->addWidget(statusEnd);
	QGroupBox* confGroupBox=new QGroupBox(tabBox);
	dataFrame->addConfGroupBox(confGroupBox); 
	tabLayoutV->addWidget(confGroupBox);
	return dataFrame;
}

#include "cconfframecreator.moc"
Basisklasse confFrame .h

Code: Alles auswählen

#include "qtinclude.h"
#include "cdevicecont.h"
#include <qobject.h>


class CConfFrame : virtual public QObject
{
	Q_OBJECT
public:
    CConfFrame();
	
	CConfFrame(const CConfFrame& original);

    ~CConfFrame();
		
	virtual bool addFrame(QString name,QWidget* widget);
	virtual bool addFrame(QString name,QWidget* widget,QWidget* parent);
	void widgetShow();
    QString getDevTypeName();
    QWidget* getParent();
    virtual CDeviceCont* getDeviceCont();
    void widgetHide();
    void addDataSize(QLineEdit* dSize);
    void addStatusStart(QSpinBox* ss);
    void addStatusEnd(QSpinBox* se);
    QLineEdit* getDataSize();
    QSpinBox* getStatusStart();
    QSpinBox* getStatusEnd();
    void setParent(QWidget* parent);
    void addConfGroupBox(QGroupBox* groupBox);
    void addDevComboHLay(QHBoxLayout* hBoxLayout);
    void addTabLayoutV(QVBoxLayout* vBoxLayout);
    void addDevCombo(QComboBox* comboBox);
    void addConfHLay(QHBoxLayout* hBoxLayout);
	virtual void addDevNames(QStringList devNames);
    QComboBox* getDevCombo();
    void addTabBox(QGroupBox* tab);
    QGroupBox* getTabBox();
    QWidget* getFirst();
protected:
	QMap<QString,QWidget*> m_Widgets;	
    QWidget* m_Parent;
	QString m_DevTypeName;
    QLineEdit* m_dataSize;
    QSpinBox* m_StatusEnd;
   	QSpinBox* m_StatusSart;
    QHBoxLayout* m_DevComboHLay;
    QVBoxLayout* m_TabLayoutV;
    QGroupBox* m_ConfGroubBox;
    QComboBox* m_DevCombo;
    bool m_Ready;
    QHBoxLayout* m_ConfHLay;
    QGroupBox* m_TabBox;
protected:
    bool ContMakeReady();

};
Basisklasse confFrame .cpp

Code: Alles auswählen

#include "cconfframe.h"

CConfFrame::CConfFrame()
	:QObject()
{
}

CConfFrame::CConfFrame(const CConfFrame& orginal)  
	:QObject()
{
	m_DevTypeName=orginal.m_DevTypeName;
	m_Parent = orginal.m_Parent;
	m_Widgets =orginal.m_Widgets;
        //...
}

CConfFrame::~CConfFrame()
{
}
danke im Vorraus für eure Hilfe
gruß
Twist
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Es wäre wirklich sinnvoll das ganze auf das Wesentliche zu reduzieren - Du glaubst doch nicht im Ernst dass man sich das alles durchliest...

- void editSourceFrame(const QString devName) --> was soll das const da - es hat so überahupt keinen Sinn
- class CConfContainer : virtual public QObject --> virtual ??
- was sagt die Konsole beim connect - dort ist meist eine sehr gute Fehlerbeschreibung --> da würdest Du sehen dass Du editSourceFrame() falsch deklariert hast das Signal ist void QComboBox::highlighted ( const QString & text )
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Christian81 hat geschrieben:Es wäre wirklich sinnvoll das ganze auf das Wesentliche zu reduzieren - Du glaubst doch nicht im Ernst dass man sich das alles durchliest...
Sag bloss Du hast noch was anderes zu tun :-)
twist
Beiträge: 7
Registriert: 19. Februar 2007 14:24

Beitrag von twist »

das const hab ich nur reingesetzt um zu testen.
brachte aber keine änderungen.

wieso zu viel Text.
bis auf die Creatorklasse, welche ich wegen des verständnisses eingefügt hab, habe ich mich eigentlich nur aufs wesentliche konzentriert beim Quelltext einfügen.

außerdem sind die Quelltexte ja untereinander getrennt so das man nicht überall reingucken muß wenn man das Konzept dahinter verstanden hat.

im Backtrace wird gar nichts darüber ausgegeben jedenfalls keine Fehler.
connect gibt einfach false zurück und dat wars. warum wird nicht geschrieben.
twist
Beiträge: 7
Registriert: 19. Februar 2007 14:24

Beitrag von twist »

ups jetzt hab ich was gefunden!

QObject::connect: No such signal QComboBox::highlighted(QString)
twist
Beiträge: 7
Registriert: 19. Februar 2007 14:24

Problem gelöst

Beitrag von twist »

es waren die Argumente.

sorry arbeite mit kdevelop. und dasd noch net lange. Finde es im moment noch sehr unübersichtlich was das tracen angeht.

aber danke für eure hilfe!!!

gruß Twist
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Problem gelöst

Beitrag von Christian81 »

twist hat geschrieben:es waren die Argumente.
Das habe ich in meinem Post schon gesagt...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten