ich arbeite mit XCode und qt 4.2.3.
Ich habe mir einen Singleton erstellt. Dieser hat eine Methode die ein Signal emitten soll. Die methode Singleton wird von einer anderen Klasse aufgerufen( Sie wird auch korrekt aufgerufen ) . In einer dritten Klasse wurde das signal des Singleton verbunden. Jedoch wird der entsprechende slot nicht aufgerufen.
Ein kurzer Testcode dazu:
main.cpp
Code: Alles auswählen
#include <QApplication>
#include <mainwindow.h>
int main(int argc, char * argv[])
{
QApplication app(argc,argv);
MainWindow mainWin;
mainWin.show();
return app.exec();
}
Code: Alles auswählen
#include <QObject>
class Singleton : public QObject
{
Q_OBJECT;
public:
// Methods to handle singleton instance.
static Singleton* getInstance(); ///< Get singleton instance. Create instance if necessary.
static bool hasInstance(); ///< Check if the singleton has an instance.
void destroyInstance(); ///< Destroy the instance of the singleton
void MethodToCall();
private:
Singleton();
~Singleton();
/// Member to hold the singleton instance.
static Singleton * _instance;
signals:
void emittedSignal();
};
Code: Alles auswählen
#include "Singleton.h"
Singleton * Singleton::_instance = 0;
Singleton:: Singleton() {
}
Singleton::~ Singleton() {
}
Singleton * Singleton::getInstance() {
if(_instance==0)
{
_instance = new Singleton;
}
return _instance;
}
bool Singleton::hasInstance() {
return _instance!=0;
}
void Singleton::destroyInstance(){
delete _instance;
_instance=NULL;
}
void Singleton::MethodToCall() {
emit this->emittedSignal();
}
Code: Alles auswählen
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class Singleton;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow();
~MainWindow();
private:
Singleton * m_singleton;
private slots:
void emitSignal();
};
#endif
Code: Alles auswählen
#include <QTGui>
#include <QPushButton>
#include "mainwindow.h"
#include "Singleton.h"
#include "Reciever.h"
MainWindow::MainWindow(){
setWindowTitle(tr("SINGLETON EMIT TEST"));
m_singleton = Singleton::getInstance();
QWidget *w =new QWidget(this);
setCentralWidget(w);
QPushButton * testButton = new QPushButton("Emit Signal" ,this);
QVBoxLayout * mainLayout = new QVBoxLayout(this);
mainLayout->addWidget(testButton);
connect(testButton, SIGNAL(clicked()), this, SLOT(emitSignal()));
Reciever * rec = new Reciever(this);
mainLayout->addWidget(rec);
w->setLayout(mainLayout);
}
MainWindow::~MainWindow(){
m_singleton->destroyInstance();
}
void MainWindow::emitSignal(){
m_singleton->MethodToCall();
}
Code: Alles auswählen
#ifndef RECIEVER_H
#define RECIEVER_H
#include <QWidget>
class Singleton;
class QLabel;
class Reciever : public QWidget
{ Q_OBJECT
public:
Reciever(QWidget *i_parent);
~Reciever();
private:
Singleton * m_singleton;
QLabel * m_msgLabel;
public slots:
void recieverSlot();
};
#endif
Code: Alles auswählen
#include <QTGui>
#include "Singleton.h"
#include "Reciever.h"
Reciever::Reciever(QWidget *i_parent)
: QWidget(i_parent),
m_singleton(NULL),
m_msgLabel(NULL)
{
m_singleton = Singleton::getInstance();
connect(m_singleton, SIGNAL(emittedSignal()),this,SLOT(recieverSlot()));
m_msgLabel = new QLabel("wait",this);
}
Reciever::~Reciever() {
}
void Reciever::recieverSlot() {
m_msgLabel->setText("CONNECTED");
}
Danke im vorraus.
gruß Mike
EDIT: lauffähiges testprog