我qt编写的程序,手动启动没有问题,但是设置自启动后就数据错乱,有跟我遇到过类似问题的吗.我是任务计划启动的
手动启动打开exe文件,则启动目录为exe所在目录。任务计划启动,则启动目录为系统目录。如果你的代码中配置文件使用的是相对路径,而非绝对路径,那么就可能存在配置文件读取失败,从而导致一些串口参数设置失败。
程序启动有加载什么文件吗
【相关推荐】
这里有2种办法,参考:《
Qt通过类名称创建类的实例的两种方法》第一种,注册元数据类型,通过类型id实例化
class Animal
{
public:
virtual void voice();
}
class Dog : public Animal
{
public:
virtual void voice();
};
// 注册类型
qRegisterMetaType<Dog>("Dog");
// 实例化
int id = QMetaType::type("Dog");
Animal *animal = static_cast<Animal*>(QMetaType::create(id));
第二种,通过QMetaObject::newInstance函数实例化
class Animal : QObject
{
public:
virtual void voice();
}
class Dog : public Animal
{
Q_OBJECT
public:
Q_INVOKABLE Dog();
virtual void voice();
};
// 注册类型
QMap<QString, QMetaObject> metaMap;
metaMap.insert("Dog", Dog::staticMetaObject);
// 实例化
Animal *animal = static_cast<Animal*>(metaMap.value("Dog").newInstance());
此种方式,限制条件:
疑问:反射实例化时,如何传参?
定义Car类
class Car : public QObject
{
Q_OBJECT
public:
Q_INVOKABLE Car(int a, double b)
{
qDebug() << "Car():" << a << b;
}
};
测试反射传参,newInstance最多支持10个参数。
// 注册类型
QMap<QString, QMetaObject> metaMap;
metaMap.insert("Car", Car::staticMetaObject);
// 实例化
metaMap.value("Car").newInstance(Q_ARG(int, 5), Q_ARG(double, 3.6));
运行结果: