Добрый день!
Очень нужна помощь вот по такому вопросу.
В класс Sample зашита статическая callback функция, которая реагирует на сообщения, например от usb устройства (или другого устройства, или какое-либо действие - неважно в данном контексте). Реакция функции - вывод некоторого текста на QLabel главного окна. Поскольку статические сигналы создавать нельзя, то я это реализовал следующим образом:
- Создал специальный класс Instance (подобие синглтона), унаследованный от QObject
- добавил в класс Instance сигнал setText и метод emitSignal() для отправки сигналов
- добавил в класс Sample член - статическую переменную m_inst типа Instance - указатель на экземпляр Instance.
- m_inst инициализируется как m_inst = new Instance и соединяется со слотом QLabel
- теперь реакция callback функции может быть реализована в виде m_inst->emitSignal()
Ниже приведен полный код (это демонстрационная вариант, сделал, чтобы суть проблемы передать):
1. instance.h
#ifndef INSTANCE_H
#define INSTANCE_H
#include <QObject>
/*Класс Instance используется как синглтон
для рассылки сигналов из static callback функции класса Sample*/
class Instance : public QObject
{
Q_OBJECT
public:
explicit Instance(QObject *parent = 0);
~Instance();
//Метод для рассылки сигналов из static callback функции класса Sample
void emitSignal(QString str);
signals:
void setText(QString);
};
#endif // INSTANCE_H
2. Instance.cpp
#include "instance.h"
Instance::Instance(QObject *parent) :
QObject(parent)
{
}
Instance::~Instance()
{
}
void Instance::emitSignal(QString str)
{
emit setText(str);
}
3. sample.h
#ifndef SAMPLE_H
#define SAMPLE_H
#include <QMainWindow>
#include "instance.h"
namespace Ui {
class Sample;
}
class Sample : public QMainWindow
{
Q_OBJECT
public:
explicit Sample(QWidget *parent = 0);
~Sample();
//Статический (и единственный) экземпляр вспомогательного класса Instance
static Instance *m_inst;
//Статическая Callback-функция, отправляющая сигналы в Label
static void callback();
private slots:
//Кнопка для генерации событий для callback
void on_pushButton_clicked();
private:
Ui::Sample *ui;
};
#endif // SAMPLE_H
4. sample.cpp
#include "sample.h"
#include "ui_sample.h"
Sample::Sample(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Sample)
{
ui->setupUi(this);
//Инициализируем синглтон и соединяем его с главным окном
m_inst = new Instance;
QObject::connect(m_inst, SIGNAL(setText(QString)), ui->label, SLOT(setText(QString)));
}
Sample::~Sample()
{
delete ui;
}
void Sample::callback()
{
Sample::m_inst->emitSignal("Texxxt");
}
void Sample::on_pushButton_clicked()
{
Sample::callback();
}
5. main.cpp
#include <QtGui/QApplication>
#include "sample.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Sample w;
w.show();
return a.exec();
}
6. .pro файл
QT += core gui
TARGET = untitled4
TEMPLATE = app
SOURCES += main.cpp\
sample.cpp \
instance.cpp
HEADERS += sample.h \
instance.h
FORMS += sample.ui
Проект не компилируется. Выводится 6 раз такая штука "ошибка: undefined reference to `Sample::m_inst'"
В чем проблема?
Заранее благодарю за помощь.