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();
}
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"
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();
};
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()
{
}
gruß
Twist