//检查是否为qobject*类型
template <typename T>
bool isQObjectDerived(const T* obj) {
return qobject_cast<QObject*>(obj) != nullptr;
}
//只支持同一线程,跨线程无法获取返回值,函数必须是槽与信号。
template <typename T>
T get(QObject* obj, const char* functionyName)
{
// 检查方法是否存在
int methodIndex = obj->metaObject()->indexOfMethod(functionyName);
if (methodIndex == -1) {
Q_ASSERT("get()->method is not exist");
}
T result;
QMetaObject::invokeMethod(obj, functionyName, Qt::DirectConnection, QReturnArgument<T>(getName(result).c_str(), result));
return result;
}
template <typename T>
std::string getName(const T& var)
{
return typeid(var).name();
}
//此模版在qt5.15.2可用,qt5.9.9无法列表初始化
template <typename... Args>
void Set(QObject *obj, const char *methodName, Args... args) {
QVariantList varArgs { QVariant(args)... };
QList<QGenericArgument> qargs;
qargs.reserve(varArgs.size());
for (const QVariant& arg : varArgs) {
qargs.append(QGenericArgument(arg.typeName(), arg.constData()));
}
QMetaObject::invokeMethod(obj, methodName, Qt::DirectConnection,
qargs.value(0, QGenericArgument()),
qargs.value(1, QGenericArgument()),
qargs.value(2, QGenericArgument()),
qargs.value(3, QGenericArgument()),
qargs.value(4, QGenericArgument()),
qargs.value(5, QGenericArgument()),
qargs.value(6, QGenericArgument()),
qargs.value(7, QGenericArgument()),
qargs.value(8, QGenericArgument()),
qargs.value(9, QGenericArgument()));
}
//qt5.9.9可用
template <typename... Args>
void Set(QObject *obj, const char *methodName, Args... args) {
std::initializer_list<QVariant> varArgs { QVariant(args)... };
QList<QVariant> varArgsList;
varArgsList.reserve(varArgs.size());
std::copy(varArgs.begin(), varArgs.end(), std::back_inserter(varArgsList));
QList<QGenericArgument> qargs;
qargs.reserve(varArgsList.size());
for (const QVariant& arg : varArgsList) {
qargs.append(QGenericArgument(arg.typeName(), arg.constData()));
}
QMetaObject::invokeMethod(obj, methodName, Qt::DirectConnection,
qargs.value(0, QGenericArgument()),
qargs.value(1, QGenericArgument()),
qargs.value(2, QGenericArgument()),
qargs.value(3, QGenericArgument()),
qargs.value(4, QGenericArgument()),
qargs.value(5, QGenericArgument()),
qargs.value(6, QGenericArgument()),
qargs.value(7, QGenericArgument()),
qargs.value(8, QGenericArgument()),
qargs.value(9, QGenericArgument()));
}
Qt.模版+QMetaObject::invokeMethod来实现反射。
于 2024-01-26 13:47:46 首次发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)