В Qt как подключить экземпляр синглтона к слоту? - PullRequest
2 голосов
/ 01 ноября 2010

Я программирую в Qt Creator и столкнулся с проблемой. Я создал одноэлементный класс и пытаюсь подключить его к слоту в виджете, но он не берет указатель, который возвращает с Singleton::getInstance() как тот же экземпляр, который излучает сигнал.

Мой код выглядит следующим образом:

class Widget : public QWidget
{        
    Q_OBJECT
    public:
         explicit Widget(QWidget *parent = 0);
         ~Widget();

    private slots:
         void setString(int var);
    }

Реализация:

connect(Singleton::getInstance(),SIGNAL(changeString(int)),this,SLOT(setString(int)));

Сигнал в классе синглтона:

signals:
    void changeString(int var);

вызов по сигналу в классе синглтона:

emit(Singleton::getInstance()->changeString(5));

Ничего не происходит, когда излучается сигнал. Отладчик не входит в слот.

Ответы [ 4 ]

2 голосов
/ 01 ноября 2010

Скорее всего, это отличающаяся сигнатура метода слота - setString(IMSS_Status); против setString(int);

Также, в случае пользовательского типа, вы должны вызвать

qRegisterMetaType("IMSS_Status");

, чтобы правильно зарегистрировать его в системе мета-типов.В противном случае выполнение слотов в очереди не будет работать, например.

0 голосов
/ 03 ноября 2010

Я бы склонялся к emit(Singleton::getInstance()->changeString(5)); не правильно.

Функция emit должна вызываться изнутри Singleton следующим образом:

emit(changeString(5));

IЯ удивлен, что код, который вы разместили, компилируется и запускается без предупреждения, я ожидал бы ошибку времени выполнения по поводу несуществующего сигнала.

0 голосов
/ 01 ноября 2010

Есть ли в классе Singleton также макрос Q_OBJECT?Я не знаю, нужно ли это тоже или нет.

0 голосов
/ 01 ноября 2010

Ваша проблема может быть вызвана подписью методов.Перед тем, как подключить сигнал к слоту, вы должны определить свой сигнал для системы, используя qRegisterMetaType<Your Class >("Class Definition name");

И является ли сигнал сигнатуры changeString?"void changeString (int)"

Я столкнулся с вашей проблемой и решил ее, создав qRegisterMetaType и контролируя подписи.

...