如何解决QML 启动外部程序:使用 QProcess 失败构建
我正在尝试用 QML 构建一个简单的应用程序,当按下按钮时,外部程序就会启动。我搜索了很多,但 99% 的解决方案都类似于 this。当我编译错误是:
Undefined symbols for architecture x86_64:
"ProcessStarter::qt_metacall(QMetaObject::Call,int,void**)",referenced from:
vtable for QQmlPrivate::QQmlElement<ProcessStarter> in main.o
"ProcessStarter::qt_metacast(char const*)",referenced from:
vtable for QQmlPrivate::QQmlElement<ProcessStarter> in main.o
"ProcessStarter::staticMetaObject",referenced from:
int qmlRegisterType<ProcessStarter>(char const*,char const*) in main.o
QtPrivate::MetaObjectForType<ProcessStarter*,void>::value() in main.o
QMetaTypeIdQObject<ProcessStarter*,8>::qt_metatype_id() in main.o
"ProcessStarter::metaObject() const",referenced from:
vtable for QQmlPrivate::QQmlElement<ProcessStarter> in main.o
"typeinfo for ProcessStarter",referenced from:
typeinfo for QQmlPrivate::QQmlElement<ProcessStarter> in main.o
"vtable for ProcessStarter",referenced from:
ProcessStarter::ProcessStarter(QObject*) in main.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
main.cpp 的代码为:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QProcess>
#include <QVariant>
#include <QQmlContext>
class ProcessStarter : public QProcess
{
Q_OBJECT
public:
ProcessStarter(QObject *parent = 0) : QProcess(parent) { }
virtual ~ProcessStarter() = default;
Q_INVOKABLE void start(const QString &program,const QVariantList &arguments)
{
QStringList args;
// convert QVariantList from QML to QStringList for QProcess
for (int i = 0; i < arguments.length(); i++)
args << arguments[i].toString();
QProcess::start(program,args);
}
Q_INVOKABLE QByteArray readAll() {
return QProcess::readAll();
}
};
int main(int argc,char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc,argv);
qmlRegisterType<ProcessStarter>("Process",1,"ProcessStarter");
QQmlApplicationEngine engine;
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine,&QQmlApplicationEngine::objectCreated,&app,[url](QObject *obj,const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
},Qt::QueuedConnection);
engine.load(url);
return app.exec();
}
相反,main.qml 是:
import QtQuick 2.12
import QtQuick.Controls 2.0
import QtQuick.Window 2.12
import Process 1.0
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
ProcessStarter {
id: process
onReadyRead: console.info(readAll())
}
Button {
onClicked: {
process.start("../prova",[ "-a","-b"])
}
}
}
我不明白错误在哪里! 问候 马可
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。