কিউএমএল অ্যাপ থেকে সিস্টেম কমান্ডগুলি চালিত করুন


16

আমি আমার অ্যাপ্লিকেশনটির ভিতরে থেকে একটি সিস্টেম কমান্ড চালাতে চাই। মনে করুন এসএসএইচ ব্যবহার করে দূরবর্তী সার্ভারে একটি কমান্ড চালানো হবে। তবে আসলেই তা বলা যায় না। মুল বক্তব্যটি আমি অ্যাপ থেকে কোনও ধরণের কমান্ড চালাতে জানি না। আমি মেল তালিকায় জিজ্ঞাসা করেছি এবং তারা আমাকে সি ++ ব্যবহার করে একটি কিউএমএল এক্সটেনশন তৈরি করতে উল্লেখ করেছে। তবে আমি সি ++ জানি না এবং মনে হয় কেবল একটি সাধারণ কমান্ড চালানোর জন্য আমাকে এত কিছু শিখতে হবে।

পাইথনে (পিএইচপি হিসাবে) সিস্টেম কমান্ড চালানো সহজ। আমার টাচ অ্যাপে এটি করার অন্য কোনও উপায় আছে, বা এমন কেউ আছেন যে আমাকে আরও সাহায্য করতে পারে? অথবা আমার সমস্যার আরও ভাল সমাধান হতে পারে?


1
"মাইনক্রাফ্ট সার্ভার", আপনি কীভাবে এই "জাস্ট মজাদার জন্য" ইত্যাদি শিখছেন তার মতো আপনার প্রশ্নের মূল অংশটি না রেখে সমস্ত সামগ্রী সরিয়ে ফেলতে পারেন? আমি জিজ্ঞাসার কারণ হ'ল এই বিবরণগুলি ইস্যুটির পাশে রয়েছে এবং শ্রদ্ধার সাথে মনোযোগ আকর্ষণীয়।
আকিভা

উত্তর:


13

এটি কিউএমএল সমর্থন করে এমন কিছু নয়, সাধারণ উত্তরটি হ'ল ধরণের জিনিস পরিচালনা করতে সি ++ প্লাগইন লিখুন।

তবে এসডিকে টিম কিউএমএল অ্যাপ বিকাশকারীদের সরবরাহ করতে বিভিন্ন এক্সটেনশনের পরিকল্পনা করছে এবং এটি এমন কিছু হতে পারে যা তারা ব্যবহার করতে পারেন এমন জেনেরিক প্লাগইনে প্রয়োগ করে।


2
যে অনেক প্রশংসা হবে! পরিবর্তে আমি পাইথন স্ক্রিপ্ট কল করার উপায় অনুসন্ধান করা শুরু করেছি, তবে আমি কেবল পাইথন স্ক্রিপ্টটি পাই যা QML চালায়, অন্যদিকে নয় the
ড্যানিয়েল হল্ম

আমি শেষ পর্যন্ত যা করেছি তা হ'ল নতুন অ্যাপ্লিকেশনটির মতো একই ফাংশনের জন্য আমি আমার ওয়েবুইতে কিছু পরিবর্তন করেছি এবং এক্সএমএল ব্যবহার করে আমার প্রয়োজনীয় তথ্যটি টানছি। বেশ ঝরঝরে.
ড্যানিয়েল হলম

1
আমি 14.04-এ কিউপ্রসেস লঞ্চার ধারণাটি চেষ্টা করেছি এবং এটি কার্যকর কাজ করেছে: Askubuntu.com/a/446736/20275
int_ua

@ mhall119 দয়া করে আমি ভুল হলে আমাকে সংশোধন করুন তবে অ্যাপআর্মারের কারণে আপনি আসলে ফোনে কিউএমএল দিয়ে এটি করতে পারবেন না। এটি আপনাকে এটি করতে বাধা দেবে।
আকিভা

10

আপডেট: 14.04 এর জন্য int_ua দ্বারা অনেক সরলিকৃত উত্তর দেখুন।

মূল পাঠ্য:

Http://talk.maemo.org/showthread.php?t=87580 এ কিউএমএলে এক্সটেনশনটি কীভাবে যুক্ত করা যায় তার একটি প্রাথমিক ওভারভিউ রয়েছে। আমি পরিবর্তে উবুন্টু-এসডিকে ব্যবহার করে এটি শট দেওয়ার সিদ্ধান্ত নিয়েছি, যা কিছুটা আলাদা। আমি নীচে নথি করব।

এই প্রকল্পের জন্য আমি কিউটিক্রিটারে সি ++ ব্যাকএন্ডের সাথে উবুন্টু টাচ / সিম্পল ইউআই নির্বাচন করেছি । এটি দুটি পৃথক অংশ, কিউএমএলে লিখিত ব্যাকএন্ড এবং টাচুই ফ্রন্ট্যান্ড সহ একটি প্রকল্প তৈরি করে। ব্যাকএন্ডে আমরা লঞ্চার ক্লাসের জন্য দুটি ফাইল যুক্ত করতে যাচ্ছি।

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

এই শ্রেণিটি কেবল কোনও প্রোগ্রাম চালানোর জন্য কিউপ্রসেস ব্যবহার করে, এটি শেষ হওয়ার জন্য অপেক্ষা করে, তার স্টাডআউটটি পড়ে এবং স্ট্রিং হিসাবে ফেরত দেয়।

এরপরে ক্লাসটি অন্তর্ভুক্ত করতে আমাদের ব্যাকএন্ড / ব্যাকএন্ডএপিপি পরিবর্তন করতে হবে। এর জন্য দুটি লাইন দরকার। একটি অন্তর্ভুক্ত অন্তর্ভুক্ত:

#include "launcher.h"

এবং ভিতরে ব্যাকএন্ডপ্লাগিনে :: নিবন্ধের টাইপগুলি একটি লাইন যুক্ত করে:

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

মাইটাইপের জন্য ইতিমধ্যে একটি লাইন থাকা উচিত, যা অন্তর্ভুক্ত উদাহরণ। এর পরে আমাদের ব্যাকএন্ডটি তৈরি করতে সক্ষম হওয়া উচিত। মেন.কিউএমএল ফাইলটিতে এটি ব্যবহার করা কেবল একমাত্র জিনিস। এর জন্য আমি একটি লাইন যুক্ত করেছি:

Launcher { id: myLauncher }

এবং বাটনের অন ক্লিক হ্যান্ডলারের কাছে সেট করুন:

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

এই মুহুর্তে যা অবশিষ্ট রয়েছে তা হল এটি শুরু করা এবং এটি পরীক্ষা করা test এখানেই আমি একটি সমস্যার মধ্যে পড়েছিলাম, কেননা QtCreator ডিফল্টরূপে সবকিছু ঠিকঠাক করে দেয় বলে মনে হয় না। আমি যেমন কাজ করি, টার্মিনালে আপনার QtCretor প্রকল্প ডিরেক্টরিতে নেভিগেট করুন এবং:

mkdir -p Ubuntu/Example

তারপরে libUbuntuExample.so ফাইলটি প্রজেক্টবিল্ডডির / ব্যাকএন্ড থেকে উবুন্টু / উদাহরণে এবং qmldir ফাইলটি প্রজেক্টনাম / ব্যাকএন্ড / qmldir থেকে অনুলিপি করুন। তারপরে আপনি চালাতে পারবেন:

qmlscene -I . ProjectName/touchui/main.qml

আমি নিশ্চিত যে এগুলি ছড়িয়ে দেওয়ার সম্ভবত একটি সহজ উপায় আছে তাই বিল্ড / রান কেবল কাজ করে।


এটি এখন কেবল 14.04 এ কাজ করে: Askubuntu.com/a/446736/20275
int_ua

6

উবুন্টু 14.04

কিউপ্রসেস লঞ্চার ধরণের ধারণাটি এখন পিপিএর সাথে ট্রাস্টে সমস্যা ছাড়াই কাজ করছে ubuntu-sdk-team। কেবল 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");

এরপরে, MyTypeকিউএমএল ফাইলগুলি থেকে সমস্ত অবশেষ পরিষ্কার করুন এবং যুক্ত করুন

        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

টার্মিনাল কমান্ডগুলি অ্যাক্সেস পেতে আপনার সত্যিকারের সি ++ সম্পর্কে অনেক কিছু জানতে হবে না। কেবলমাত্র .cpp- র সাথে শেষ হওয়া কোনও ফাইলের মধ্যে নিম্নলিখিতগুলি রাখুন, উদাহরণস্বরূপ runPython.cpp।

#include <stdlib.h>

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

আপনাকে এখনই যা শিখতে হবে তা হল কিউএমএলে সি ++ কোড চলমান কীভাবে পাওয়া যায় তবে আমি নিশ্চিত যে এটি খুব ভাল নথিভুক্ত।

নোট করুন যে আপনি একই সিনট্যাক্স অনুসরণ করে আপনার পছন্দ মতো কোনও লিনাক্স কমান্ড যুক্ত করতে পারেন system("linux command");

আশাকরি এটা সাহায্য করবে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.