Отправка сигнала из метода статического класса в Qt

Я пытаюсь закодировать статическую функцию обратного вызова, которая часто вызывается из другой статической функции в том же классе. Моя функция обратного вызова должна 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);
    }
};

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

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

3 ответов


это не сработает, потому что вы создаете новый 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);
    }
};

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


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

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);
    }
};

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


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

    static int callback(int val)
   {
   /* Called multiple times (100+) */
   MYClass::getInstance()->emitFunction(val);
   }

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

обратите внимание, однако, что в целом не рекомендуется излучать сигналы от статических функций. Статические функции могут вызываться без создания экземпляра класса, что означает, что (если вы не предоставляете в качестве аргумента отправителя и не используете его явно), у вас не будет объекта "отправитель" для излучаемых сигналов.

для этих случаев, как предлагает Lol4t0, я также предпочитаю обратные вызовы.