2015-09-13 2 views
0

У меня есть QList из QGenericArgument в моем приложении (для реализации класса обработчиков событий). В одном конкретном случае мне нужно извлечь значение аргумента, чтобы выполнить некоторую проверку. Я знаю тип. Так что я написал это:Как я могу получить значение QGenericArgument?

template <class T> 
T GetQArgumentValue(QGenericArgument &arg) 
{ 
    const unsigned char* data = reinterpret_cast<const unsigned char*>(arg.data()); 
    return (T) *data; 
} 

и использовать так:

QGenericArgument arg = Q_ARG(int, 30); // this is obviously an example, I get this from an array in real code 
int value = GetQArgumentValue<int>(arg); 

Он хорошо работает. Так что мой вопрос:

1) Так как это внутренний вспомогательный класс, есть ли проблема с его использованием в моем приложении?

2) Есть ли встроенная функция для этого? Я предпочитаю встроенные, заново изобретать колесо.

редактировать:

То, что я хочу это:

давайте предположим, что у меня есть:

QGenericArgument arg = Q_ARG(int, 30); 

Я хочу, чтобы получить значение 30 назад:

int v = magic_function<int>(arg); // v = 30

+1

Каков ваш прецедент? 'QGenericArgument' используется только для' QMetaObject :: invokeMethod() '. –

+0

Я создал собственный класс, где у меня есть 'QList'' QGenericArgument', где они в конечном итоге передаются в 'QMetaObject :: invokeMethod()' – Jack

+0

Этот вопрос немного страдает от проблемы [xy] (http: // meta. stackexchange.com/questions/66377/what-is-the-xy-problem). Было бы более полезно, если бы вы сказали нам, почему вам нужны эти общие аргументы. Каков ваш прецедент? Опишите на высоком уровне то, что вы пытаетесь сделать, возможно, есть лучшее решение, которое не зависит от 'QGenericArgument'. –

ответ

3

В документации Qt не рекомендуется использовать QGenericArgument любым способом, кроме создания его Q_ARG для перехода на QMetaObject::invokeMethod(). Причина в том, что класс QGenericArgument фактически представляет собой пару двух указателей (членов класса): void* для данных и const char* для имени.

Он будет работать. Тем не менее, он похож на список указателей void, и это тоже плохо.

Если вы передаете такой список любой функции, вам следует позаботиться о времени жизни этих объектов: исходные объекты, на которые указывают эти указатели, должны оставаться в силе в течение достаточно длительного времени, а также сложны с дешифровкой таких объектов.

Если вам нужно управлять динамическим списком аргументов, прежде чем передавать их в QMetaMethod, безопаснее и удобнее использовать некоторую оболочку для этих аргументов. Например, в Qt есть класс QVariant. Таким образом, QListQVariant или QVariantMap можно использовать здесь.

+0

Я знаю большую часть этого. То, что я пытаюсь сделать, это список событий, которые в конечном итоге вызываются. Примерно аналогично внутренней реализации QT, которая запускает 'loadFinished' при загрузке страницы. – Jack

Смежные вопросы