Отправка сигнала из метода статического класса в 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, я также предпочитаю обратные вызовы.