Это имеет большой смысл. Я полагаю, QSignalMapper
не то, что вы хотите. Если у ваших функций нет аргументов, возможно, вам достаточно что-то вроде этого:
class SlotForwarder : public QObject
{
Q_OBJECT
public:
typedef void (*Function)(); // or whatever. I never get this syntax right...
SlotForwarder(Function function, QObject* parent = 0)
: QObject(parent)
, m_fptr(function)
{}
public slots:
void forward()
{
m_fptr();
}
private:
Function m_fptr;
};
Создайте по одной для каждой функции, которую вы хотите инкапсулировать, и подключите к forward
как обычно.
Теперь, если у них есть аргументы, возможно, эта статья Qt Quarterly может помочь.
Динамические сигналы и слоты Эскил А. Бломфельдт
Техника включает в себя переопределение метода qt_metacall
самостоятельно. У метода есть такая подпись:
int QObject::qt_metacall(QMetaObject::Call call, int id, void **arguments)
Call - это вид метаколла: слот, сигнал, чтение или запись свойства и т. Д. Каждый слот имеет id . Параметры упакованы (по значению или в виде указателей) внутри массива arguments . Чтение кода, сгенерированного moc, является хорошим способом понять, как все это работает.
Данные о необработанных сигнатурах функций доступны только во время компиляции, но слоты разрешаются во время выполнения. Из-за этого несоответствия вам нужно будет обернуть функции в тип адаптера шаблона, который представляет постоянный интерфейс для вашей реализации qt_metacall
и преобразует массив arguments
в то, что функция может понять (см. Python распаковать оператор). Boost.Signals делает шаблонный взлом .