Russian Qt Forum

Qt => Общие вопросы => Тема начата: jaroslav от Июль 15, 2013, 23:57



Название: Qt template
Отправлено: jaroslav от Июль 15, 2013, 23:57
Привет! Подскажите плиз, что не так делаю.

Есть функция:
Код:
template <typename T> void execAction(const QString &stored, const T &value);

Вот реализация:
Код:
template <typename T> void MyClass::execAction(const QString &stored, const T &value){
...

QMetaObject::invokeMethod(object*, QString("%1").arg(stored).toUtf8().constData(), Q_ARG(T, value));

...
}

Вызываю так:
Код:
execAction("slotCopyRecords", 1);

Слот не срабатывает, выдает
Код:
QMetaObject::invokeMethod: No such method MyClass::slotCopyRecords(T)


Название: Re: Qt template
Отправлено: kambala от Июль 16, 2013, 01:06
Q_ARG – это макрос, который о типе T ничего не знает, так что шаблон тут не сработает


Название: Re: Qt template
Отправлено: jaroslav от Июль 16, 2013, 01:10
Может есть идеи решения проблемы? Поделитесь пожалуйста. Хотелось бы в функцию передавать разного типа данные, и что-б invokeMethod это хавал нормально.


Название: Re: Qt template
Отправлено: kambala от Июль 16, 2013, 01:54
если execAction() вызывается напрямую (не из потока), то можно попробовать передавать указатель на метод вместо строки и его уже вызывать для object


Название: Re: Qt template
Отправлено: jaroslav от Июль 16, 2013, 15:02
Спасибо kambala за помощь. Сделал вот как:

Переделал функцию:

Код:
void LogisticMainWindow::execAction(const QString &stored, const QVariant &arg)

Вместо template, заюзал QVariant, с подгонкой типа относительно введенных данных.


Код:

void LogisticMainWindow::execAction(const QString &stored, const QVariant &arg) {

...

QGenericArgument genericArgument;

    if (arg.isValid()){
        genericArgument = QGenericArgument(arg.typeName(), arg.data());
    }

....


И вызов самого invokeMethod:

Код:
QMetaObject::invokeMethod(Object*, QString("%1").arg(stored).toUtf8().constData(), genericArgument); 


Название: Re: Qt template
Отправлено: kambala от Июль 16, 2013, 15:18
а зачем надо так хитро создавать строку метода вместо обычного stored.toUtf8().constData()?


Название: Re: Qt template
Отправлено: jaroslav от Июль 16, 2013, 18:14
Да, вполне можно и так. Спасибо!