Отправка сигнала из метода статического класса в Qt - PullRequest
10 голосов
/ 23 февраля 2012

Я пытаюсь закодировать статическую функцию обратного вызова, которая часто вызывается из другой статической функции в том же классе. Моя функция обратного вызова должна emit сигнал, но по какой-то причине она просто не может это сделать. Я поместил его в отладчик, и slot никогда не вызывается. Однако, когда я помещаю код, который использовал для emit данных, в нестатическую функцию, это работает. Есть ли причина, по которой я не могу излучать сигнал от статической функции? Я попытался объявить новый экземпляр класса и вызвать функцию emit, но безуспешно.

class Foo
{
signals:
    emitFunction(int);
private:
    static int callback(int val)
    {
        /* Called multiple times (100+) */
        Foo *foo = new Foo;
        foo.emitFunction(val);
    }
    void run()
    {
        callback(percentdownloaded);
    }
};

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

Редактировать: я публикую полный код, поскольку это довольно странный сценарий. http://pastebin.com/6J2D2hnM

Ответы [ 4 ]

11 голосов
/ 23 февраля 2012

Это не сработает, потому что вы создаете новый Foo каждый раз, когда вы входите в эту статическую функцию, и вы не подключаете сигнал к слоту.

Итак, исправление должно было бы пройтиобъект этой функции:

class Foo
{
signals:
    emitFunction(int);
private:
    static int callback(int val, Foo &foo)
    {
        /* Called multiple times (100+) */
        foo.emitFunction(val);
    }
    void run()
    {
        callback(percentdownloaded, *this);
    }
};

Другой вариант - использовать postEvent , но я бы не рекомендовал его.


Так как вы не можете изменитьподпись обратного вызова, вы можете сделать это так:

class Foo
{
signals:
    emitFunction(int);
private:
    static int callback(int val)
    {
        /* Called multiple times (100+) */
        theFoo->emitFunction(val);
    }
    static Foo *theFoo;
    void run()
    {
        callback(percentdownloaded, *this);
    }
};

, но вам придется где-то инициализировать эту статическую переменную.

2 голосов
/ 16 августа 2013

в случае, если кто-то все еще находит решение, вот что я сделал, это работает в моем проекте.1. сделать ваш класс одноэлементным 2. в статической функции cb загрузите emitFunction из вашего одноэлементного класса

    static int callback(int val)
   {
   /* Called multiple times (100+) */
   MYClass::getInstance()->emitFunction(val);
   }
1 голос
/ 24 октября 2018

Есть элегантное решение. Вы можете излучать сигнал в статической функции-члене, например так:

emit (instance().newMessage(message));
0 голосов
/ 23 февраля 2012

Вы должны предоставить указатель на экземпляр класса, чтобы он работал.

Обратите внимание, однако, что в общем случае не рекомендуется излучать сигналы от статических функций.Статические функции можно вызывать без создания экземпляра класса, а это означает, что (если вы не предоставите в качестве аргумента отправителя и явно его используете), у вас не будет объекта «отправитель» для излучаемых сигналов.1004 * Для этих случаев, как предполагает Lol4t0, я также предпочитаю обратные вызовы.

...