Perintah sistem plugin Qt qml

Saya ingin mengimplementasikan fitur pada UI buatan QT. Saya menginginkannya, ketika saya menekan tombol dari UI, aplikasi harus mengirimkan perintah sistem ke mesin. Misalnya, ketika saya mengklik tombol, perintah sudo systemctl start application.service harus dijalankan. Bagian dari file QML terlihat seperti ini:

    ...

    UIPage {
        id: root

        PopupInterface {
            id: popupInterface
            actions: [ { text: "OK" }, { text: "Cancel" } ]
            title: "Settings"

            ...

            onActionTriggered: {
                if (actionId === "0" && !currentState) {


                        Process.start("/bin/cat", [ "/proc/uptime" ]);


                } else if (actionId === "0" && currentState) {


                        Process.start("/bin/cat", [ "/proc/uptime" ]);


                }
                ...
            }
        ...

Dan ini headernya:

#include <QProcess>
#include <QVariant>

class Process : public QProcess {
    Q_OBJECT

public:
    Process(QObject *parent = 0) : QProcess(parent) { }

    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();
    }
};

Saya menemukan di sana beberapa kode c++ untuk perintah sistem (http://www.xargs.com/qml/process.html), tapi saya tidak tahu di mana harus meletakkannya (file header), karena struktur proyek UI rumit. Saya mencoba menambahkan fitur ini ke Neptune UI (https://github.com/qtproject/qt-apps-neptune-ui/tree/5.10), dan file qml dapat ditemukan di sysui/display/FunctionsPage.qml Apa yang harus saya lakukan untuk menjalankan perintah sistem dari file qml?


person DanVison    schedule 27.07.2018    source sumber


Jawaban (1)


Anda harus mendaftarkan C++ QObject agar tersedia dalam kode Qml. Hal ini dapat dilakukan dengan panggilan berikut:

qmlRegisterSingletonType<Process>("yourapp.tools", 1, 0, "Process", &createInstance);

Anda bisa mulai dengan memasukkannya ke dalam fungsi main() Anda, mungkin Anda sendiri yang tahu tempat yang lebih baik.

Fungsi createInstance dideklarasikan sebagai berikut (Anda mungkin harus menempatkannya di suatu tempat di file yang sama):

QObject *createInstance(QQmlEngine *eng, QJSEngine *js)
{
    Q_UNUSED(eng)
    Q_UNUSED(js)

    return new Process;
}

Anda juga bisa mendaftar secara berbeda, tidak singleton dan sebagainya. Anda dapat menemukannya di dokumen berikut: QQmlEngine . Tapi menurut saya singleton sesuai dengan kebutuhan Anda

person Amfasis    schedule 27.07.2018