Kommunikation mit JLine

Qt Programmierung, QML, Qt-Plattformen
Ü-Ei
Beiträge: 20
Registriert: Mo Apr 21, 2014 1:31 pm

Kommunikation mit JLine

Beitrag von Ü-Ei » Fr Jul 25, 2014 4:37 pm

Hallo,
ich stehe mal wieder vor einem Problem.
In meinem Programm muss ich mit einem Java-Programm kommunizieren, dass
JLine verwendet. Den Output kann ich Problemlos mit QProcess::readAll() auslesen.
Nur wenn ich dem Programm ein Bytearray sende mit QProcess::write(QByteArray)
schein dies nicht an zu kommen, da im Terminal immer ein Echo kommt
(Befehl ausgeführt/Befehl existiert nicht).

Ich persönlich denke ich versuche in den falschen Inputstream zu schreiben, aber
gefunden hab ich darüber noch nichts.

Gruß Ü-Ei

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Kommunikation mit JLine

Beitrag von nufan » Fr Jul 25, 2014 5:19 pm


Ü-Ei
Beiträge: 20
Registriert: Mo Apr 21, 2014 1:31 pm

Re: Kommunikation mit JLine

Beitrag von Ü-Ei » Sa Jul 26, 2014 12:47 pm

Mit dem Abfangen des Outputs habe ich keine Probleme, denn ich sehe
den Standartoutput des Programmes, was auch im Terminal zu sehen ist.

Hier der Beispielcode:

MainWindow.h

Code: Alles auswählen

#include <QMainWindow>
#include <QString>
#include <QTreeWidgetItem>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    void Laden(QTreeWidgetItem *parent, QString Name, int High);
    ~MainWindow();

private slots:
    void on_treeView_itemClicked(QTreeWidgetItem *item, int column);

private:
    Ui::MainWindow *ui;
};
MainWindow.cpp

Code: Alles auswählen

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSettings>
#include <QStringList>
#include <QTreeWidgetItem>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QTreeWidgetItem *neu = new QTreeWidgetItem(ui->treeView, QTreeWidgetItem::Type);
    neu->setText(0, "HKEY_LOCAL_MACHINE");
    this->Laden(neu, "HKEY_LOCAL_MACHINE", 0);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::Laden(QTreeWidgetItem *parent, QString Name, int High)
{
    if(High > 4){
        return;
    }

    QSettings Momentan(Name,  QSettings::NativeFormat);
    QStringList Sammeln = Momentan.childGroups();
    for(int i = 0; i<Sammeln.count(); i++){
        QTreeWidgetItem *neu = new QTreeWidgetItem(parent);
        neu->setText(0, Sammeln.at(i));
        neu->setText(1,Name + "\\" + Sammeln.at(i));
        this->Laden(neu, Name + "\\" + Sammeln.at(i), High + 1);
    }
    QStringList Sammelntwo = Momentan.childKeys();
    for(int i = 0; i<Sammelntwo.count(); i++){
        QTreeWidgetItem *neu = new QTreeWidgetItem();
        neu->setText(0, Sammelntwo.at(i));
        neu->setText(1,Name + "\\" + Sammelntwo.at(i));
        neu->setText(2, Momentan.value(Sammelntwo.at(i)).toString());
        parent->addChild(neu);
    }
}

void MainWindow::on_treeView_itemClicked(QTreeWidgetItem *item, int column)
{
    ui->lineEdit->setText(item->text(1));
}
die main.cpp ist autogeneriert.

Ist das mit dem Prog->write(QByteArray) richtig?
Das wäre hier an dieser Stelle meine einzige Frage.
Wenn das stimmt muss ich mich an ein Java-Forum
weden und die mal Fragen wie das mit JLine geht

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Kommunikation mit JLine

Beitrag von nufan » Sa Jul 26, 2014 1:08 pm

Ü-Ei hat geschrieben:Mit dem Abfangen des Outputs habe ich keine Probleme, denn ich sehe
den Standartoutput des Programmes, was auch im Terminal zu sehen ist.
Wenn du dir den verlinkten Beitrag genau anschaust, wirst du sehen, dass ich Kommandos an meinen Prozess schicke.
Ü-Ei hat geschrieben:Ist das mit dem Prog->write(QByteArray) richtig?
Ich sehe diese Zeile im Code nicht. Prinzipiell ist es die richtige Methode, aber ich weiß nicht unter welchen Umständen du sie aufrufst.
Mit "Demo-Code" meinte ich etwas Kurzes, Kompilierbares, das aber trotzdem genau das macht was du willst. Und das sowohl für Qt als auch die Java-Seite.

Ü-Ei
Beiträge: 20
Registriert: Mo Apr 21, 2014 1:31 pm

Re: Kommunikation mit JLine

Beitrag von Ü-Ei » So Jul 27, 2014 5:25 pm

Ach Himmel noch mal! Da hatte ich in der Eile den falschen Code gepackt!

Hier der richtige:
Mainwindow.h

Code: Alles auswählen

#include <QMainWindow>
#include <QProcess>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:

    void on_InputText_LineEdit_returnPressed();

    void on_SendButton_clicked();

    void SendCommand();

    void ReadAll();

private:
    Ui::MainWindow *ui;
    QProcess *Prog;
};
Mainwindoe.cpp

Code: Alles auswählen

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDir>
#include <QSettings>
#include <QFile>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    bool error = false;

    //Prüfen der auszuführenden Datei

    QFile Infor(QDir::currentPath()+"/Infor.jar");
    if(!Infor.exists()){
        ui->Output_TextEdit->append("Infor ist nich im Hauptverzeichniss");
        error = true;
    }

    //Finden von Java

    QSettings Java("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment",QSettings::NativeFormat);
    QString Javaversion = Java.value("CurrentVersion").toString();
    QString Javalocation;
    ui->Output_TextEdit->append(Javaversion);
    if(Javaversion.isEmpty()){
        ui->Output_TextEdit->append("Java is not installed");
        error = true;
    } else {
        QSettings Jpath("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\"+Javaversion,QSettings::NativeFormat);
        Javalocation = Jpath.value("JavaHome").toString();
    }

    //Nicht starten wenn Fehler erkannt wurde

    if(error){
        return;
    }

    //Starten von Infor-Javaapllication

    Prog = new QProcess(this);
    Prog->setProcessChannelMode(QProcess::MergedChannels);
    connect(Prog, SIGNAL(readyRead()), this, SLOT(ReadAll()));
    QString JarFilePath = QDir::currentPath()+"/Infor.jar";
    QStringList args;
    args<<"-jar"<<JarFilePath.replace("/","\\");
    Prog->start(Javalocation + "\\bin\\javaw.exe", args, QProcess::ReadWrite);
    ui->Output_TextEdit->append("Started Java with Infor.jar");
}

MainWindow::~MainWindow()
{
    delete ui;
    Prog->close();
    Prog->waitForFinished();
    delete Prog;
}

void MainWindow::on_InputText_LineEdit_returnPressed()
{
    this->SendCommand();
}

void MainWindow::on_SendButton_clicked()
{
    this->SendCommand();
}

void MainWindow::ReadAll()
{
    QByteArray Output = Prog->readAll();
    QString convert(Output);
    ui->Output_TextEdit->append(convert);
}

void MainWindow::SendCommand()
{
    Prog->write(ui->InputText_LineEdit->text().toUtf8());
    ui->InputText_LineEdit->setText("");
}
Mit der letzten Funktion MainWindow::SendCommand() will ich einen Befehl an Java geben.
Auf der Java-Seite wird es problematisch, da ich da nur ein gekauftes Programm habe und ich sonst überhaupt nicht mit Java kann. Ich habe nur nach langem recherieren herausgefunden, dass JLine da heufige Probleme machen sollte aber noch keine Lösung gefunden.

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Kommunikation mit JLine

Beitrag von nufan » So Jul 27, 2014 7:18 pm

Dein Code ist so noch immer nicht kompilierbar. Das UI und die Projektkonfiguration fehlen. Außerdem hast du noch nicht beschrieben was das Java-Programm mit der Eingabe machen soll bzw. was deine Eingabe überhaupt ist.

Blöd drauf los geraten würde ich sagen häng im Qt-Programm ein Newline an den Text dran, den du Java schickst.

Ü-Ei
Beiträge: 20
Registriert: Mo Apr 21, 2014 1:31 pm

Re: Kommunikation mit JLine

Beitrag von Ü-Ei » Fr Aug 01, 2014 3:10 pm


nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Kommunikation mit JLine

Beitrag von nufan » Fr Aug 01, 2014 5:46 pm

Und was macht das Java-Programm mit der Eingabe? Kann man davon eine Dummy-Version nachbauen?

Ü-Ei
Beiträge: 20
Registriert: Mo Apr 21, 2014 1:31 pm

Re: Kommunikation mit JLine

Beitrag von Ü-Ei » Sa Aug 02, 2014 7:30 pm

Ich überhaupt keinen Schimmer von Java, aber ich denke das dieser Code hier funktionieren sollte.
http://jeszysblog.wordpress.com/2012/04 ... ith-jline/

Konnte es aber nicht ausführen, da ich keinen Java-Compiler habe.

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Kommunikation mit JLine

Beitrag von nufan » Sa Aug 02, 2014 8:27 pm

Das ist leider nicht wirklich eine Antwort auf meine Frage, so kann ich dir leider nicht weiterhelfen :/
Ich habs geschafft Kommandos an eine Demo-Anwendung von der Homepage zu schicken und die Antwort auszulesen. Wirklich gut scheint das unter Linux nicht zu funktionieren, auch wenn ich das Programm direkt auf der Konsole starte.

Antworten