QML ऐप से रन सिस्टम कमांड


16

मैं अपने एप्लिकेशन के अंदर से एक सिस्टम कमांड चलाना चाहता हूं। यह SSH का उपयोग कर एक दूरस्थ सर्वर पर एक कमांड चलाने के लिए लगता है। लेकिन यह वास्तव में बात नहीं है। मुद्दा यह है कि मैं नहीं जानता कि ऐप से किसी भी प्रकार की कमांड कैसे चलाएं। मैंने मेल सूची में पूछा और उन्होंने मुझे C ++ का उपयोग करके QML एक्सटेंशन बनाने के लिए कहा। लेकिन मुझे C ++ का पता नहीं है और ऐसा लगता है कि मुझे केवल एक साधारण कमांड चलाने के लिए इतना सीखना है।

पायथन में (PHP में) सिस्टम कमांड को चलाना आसान है। क्या मेरे टच ऐप में ऐसा करने का कोई अन्य तरीका है, या कोई ऐसा व्यक्ति है जो मेरी और भी मदद कर सकता है? या शायद मेरी समस्या का बेहतर समाधान है?


1
क्या आप अपने प्रश्न के मूल के साथ नहीं होने वाली सभी सामग्री को हटा सकते हैं, जैसे कि "Minecraft Server", आप इसे कैसे सीख रहे हैं "जस्ट फ़न", आदि? मेरे द्वारा पूछे जाने का कारण यह है क्योंकि ये विवरण मुद्दे के बगल में हैं और बहुत ध्यानपूर्वक, सम्मानपूर्वक।
अकिवा

जवाबों:


13

यह ऐसा कुछ नहीं है जो QML का समर्थन करता है, विशिष्ट उत्तर उस तरह की चीज़ को संभालने के लिए C ++ प्लगइन लिखना है।

हालाँकि, SDK टीम QML ऐप डेवलपर्स को प्रदान करने के लिए विभिन्न एक्सटेंशन की योजना बना रही है, और यह कुछ ऐसा हो सकता है जो वे जेनेरिक प्लगइन में लागू करते हैं जिसे आप उपयोग कर सकते हैं।


2
यह बहुत सराहना की जाएगी! मैंने इसके बजाय एक पायथन स्क्रिप्ट को कॉल करने का तरीका ढूंढना शुरू कर दिया है, लेकिन मैं केवल पायथन स्क्रिप्ट ढूंढ सकता हूं जो QML चलाता है, और दूसरा तरीका नहीं है।
डेनियल होल्म

मैंने आखिरकार यह किया कि मैंने नए ऐप के समान फ़ंक्शन के लिए अपने वेबुई में कुछ बदलाव किए, और XML का उपयोग करके मुझे जो जानकारी चाहिए, उसे खींच लें। काफी साफ़।
डैनियल होल्म

1
मैंने 14.04 में QProcess Launcher कॉन्सेप्ट को आज़माया है और यह ठीक काम करता है: askubuntu.com/a/446736/20275
int_ua

@ mhall119 अगर मैं गलत हूं, तो कृपया मुझे सुधार दें, लेकिन AppAmmor की वजह से आप वास्तव में QML के साथ ऐसा नहीं कर सकते। यह आपको ऐसा करने से रोकेगा।
अकिवा

10

अद्यतन: 14.04 के लिए int_ua द्वारा बहुत सरल उत्तर देखें।

मूल लेख:

पर http://talk.maemo.org/showthread.php?t=87580 वहाँ कैसे QML एक्सटेंशन जोड़ना की एक बुनियादी अवलोकन है। मैंने इसे ubuntu-sdk के बजाय एक शॉट देने का फैसला किया, जो थोड़ा अलग है। मैं नीचे दस्तावेज़ हूँ।

इस परियोजना के लिए मैंने QtCreator में C ++ बैकएंड के साथ Ubuntu Touch / Simple UI का चयन किया । यह दो अलग-अलग हिस्सों के साथ एक प्रोजेक्ट बनाता है, क्यूएमएल में लिखा बैकएंड और टचुई फ्रंटेंड। बैकएंड के लिए हम लॉन्चर क्लास के लिए दो फाइलें जोड़ने जा रहे हैं।

launcher.h:

#ifndef LAUNCHER_H
#define LAUNCHER_H

#include <QObject>
#include <QProcess>

class Launcher : public QObject
{
    Q_OBJECT
public:
    explicit Launcher(QObject *parent = 0);
    Q_INVOKABLE QString launch(const QString &program);

private:
    QProcess *m_process;
};

#endif // LAUNCHER_H

launcher.cpp:

#include "launcher.h"

Launcher::Launcher(QObject *parent) :
    QObject(parent),
    m_process(new QProcess(this))
{
}

QString Launcher::launch(const QString &program)
{
    m_process->start(program);
    m_process->waitForFinished(-1);
    QByteArray bytes = m_process->readAllStandardOutput();
    QString output = QString::fromLocal8Bit(bytes);
    return output;
}

यह वर्ग बस प्रोग्राम को निष्पादित करने के लिए QProcess का उपयोग करता है, इसके समाप्त होने की प्रतीक्षा करता है, इसके स्टडआउट को पढ़ता है, और इसे एक स्ट्रिंग के रूप में लौटाता है।

आगे हमें कक्षा को शामिल करने के लिए बैकएंड / बैकएंड को संशोधित करना होगा। इसके लिए दो लाइनों की आवश्यकता होती है। एक में शामिल करें:

#include "launcher.h"

और BackendPlugin :: registerTypes में एक पंक्ति जोड़ें:

qmlRegisterType<Launcher>(uri, 1, 0, "Launcher");

MyType के लिए पहले से ही एक पंक्ति होनी चाहिए, जो कि शामिल उदाहरण है। इसके बाद हमें बैकएंड बनाने में सक्षम होना चाहिए। केवल एक चीज जो बनी हुई है, वह इसे main.qml फ़ाइल में उपयोग करना है। इसके लिए मैंने एक पंक्ति जोड़ी:

Launcher { id: myLauncher }

और बटन पर क्लिक करें हैंडलर, सेट करें:

myType.helloWorld = myLauncher.launch("date");

इस बिंदु पर जो कुछ भी बचा हुआ है, उसे शुरू करना है और उसका परीक्षण करना है। यहाँ है जहाँ मैं एक समस्या में भाग गया, क्योंकि QtCreator डिफ़ॉल्ट रूप से सब कुछ ठीक से सेट नहीं करता है। जैसा कि मैंने वर्कअराउंड किया, टर्मिनल में अपने QtCreator प्रोजेक्ट डायरेक्टरी में जाएँ और:

mkdir -p Ubuntu/Example

तब ProjectBuildDir / backend से Ubuntu / Example, और ProjectName / backend / qmldir से qmldir फ़ाइल से libUbuntuExample.so फ़ाइल की प्रतिलिपि बनाएँ। तब आप चला सकते हैं:

qmlscene -I . ProjectName/touchui/main.qml

मुझे यकीन है कि इस सब को रिग करने का एक सरल तरीका है इसलिए बिल्ड / रन बस काम करता है।


यह अब सिर्फ 14.04 में काम करता है: askubuntu.com/a/446736/20275
int_ua

6

उबंटू 14.04

QProcess Launcher प्रकार की अवधारणा अब ubuntu-sdk-teamPPA के साथ ट्रस्टी में समस्याओं के बिना काम कर रही है । बस QML Extension Library + Tabbed UIप्रोजेक्ट बनाएं ( प्रोजेक्ट नाम में हाइफ़न का उपयोग न करें ), की सामग्री को बदलें

mytype.h

#ifndef LAUNCHER_H
#define LAUNCHER_H

#include <QObject>
#include <QProcess>

class Launcher : public QObject
{
    Q_OBJECT

public:
    explicit Launcher(QObject *parent = 0);
    ~Launcher();
    Q_INVOKABLE QString launch(const QString &program);

protected:
    QProcess *m_process;
};

#endif // LAUNCHER_H

mytype.cpp

#include "mytype.h"

Launcher::Launcher(QObject *parent) :
    QObject(parent),
    m_process(new QProcess(this))
{

}

QString Launcher::launch(const QString &program)
{
    m_process->start(program);
    m_process->waitForFinished(-1);
    QByteArray bytes = m_process->readAllStandardOutput();
    QString output = QString::fromLocal8Bit(bytes);
    return output;
}

Launcher::~Launcher() {

}

और परिवर्तन qmlRegisterTypeमें backend.cppकरने के लिए

qmlRegisterType<Launcher>(uri, 1, 0, "Launcher");

अगला, केवल MyTypeQML फ़ाइलों से सभी अवशेषों को साफ़ करें और जोड़ें

        Rectangle {

          Launcher {
             id: qprocess
          }

          Text {
            anchors.centerIn: parent
            text: qprocess.launch("which bash")
          }
        }

आपको जहां भी पसंद हो और

import projectname 1.0

शुरुआत में।

ऐच्छिक

मैं भी इस आवरण का उपयोग करता हूं:

function exec(command) {
    return qprocess.launch("sh -c \"" + command + " < /dev/null \"")
}

यदि आपको रूट एक्सेस की आवश्यकता है, तो जोड़ें pkexec


1
मैं बस यह पुष्टि करना चाहूंगा कि इस समाधान ने मेरे लिए उत्कृष्ट काम किया। आप जो भी इनपुट करते हैं, उसका आउटपुट आयत में प्रदर्शित होता है।
अकीवा

2

टर्मिनल कमांड का उपयोग करने के लिए आपको वास्तव में c ++ के बारे में बहुत कुछ जानने की आवश्यकता नहीं है। उदाहरण के लिए, runPython.cpp .cpp के साथ समाप्त होने वाली किसी भी फ़ाइल में बस निम्नलिखित डालें।

#include <stdlib.h>

int main ()
{
    system("cd /home/user/path/to/script");
    system("python3 myScript.py");
    return 0;
}

अब आपको यह पता लगाना है कि क्यूएमएल में c ++ कोड कैसे चल रहा है, लेकिन मुझे यकीन है कि यह बहुत अच्छी तरह से प्रलेखित है।

ध्यान दें कि आप एक ही वाक्यविन्यास का पालन करके अपनी पसंद के किसी भी लिनक्स कमांड को जोड़ सकते हैं system("linux command");

उम्मीद है की यह मदद करेगा!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.