Russian Qt Forum
Октябрь 01, 2024, 00:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt template  (Прочитано 3841 раз)
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)
« Последнее редактирование: Июль 16, 2013, 00:42 от jaroslav » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #1 : Июль 16, 2013, 01:06 »

Q_ARG – это макрос, который о типе T ничего не знает, так что шаблон тут не сработает
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
jaroslav
Гость
« Ответ #2 : Июль 16, 2013, 01:10 »

Может есть идеи решения проблемы? Поделитесь пожалуйста. Хотелось бы в функцию передавать разного типа данные, и что-б invokeMethod это хавал нормально.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #3 : Июль 16, 2013, 01:54 »

если execAction() вызывается напрямую (не из потока), то можно попробовать передавать указатель на метод вместо строки и его уже вызывать для object
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
jaroslav
Гость
« Ответ #4 : Июль 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); 
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #5 : Июль 16, 2013, 15:18 »

а зачем надо так хитро создавать строку метода вместо обычного stored.toUtf8().constData()?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
jaroslav
Гость
« Ответ #6 : Июль 16, 2013, 18:14 »

Да, вполне можно и так. Спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.066 секунд. Запросов: 22.