Creating QT Application as GUI for existing console-based application on windows

前端 未结 2 2082
日久生厌
日久生厌 2020-12-06 15:25

i\'m trying to set up a GUI with Qt for an existing application which is meant to be run in the windows commandline. It\'s not just running the app with the system()<

2条回答
  •  猫巷女王i
    2020-12-06 16:18

    I found a solution for my needs and can do what i want to do.. Actually i'm a bit disappointed. I thought it would be something more complex.

    First i have to say it's an QtQuick Application .. Maybe i should have said that earlier.

    I simply outsourced the process functions to another class. This class is passed to QML via the qmlRegisterType<>() function. I connected some signals from the process ( QProcess ) to slots in my own class and wrote my own functions to handle reading/writing data from and to the console application. With the QML-onClicked events i can pass my parameters and strings to the console app. And with some application logic i can handle the in/out requests and timings.

    WrapperClass.h

    class WrapperClass: public QObject
    {
        Q_OBJECT
    
    public:
        explicit WrapperClass(QObject *parent = nullptr);
    
        QProcess *process;
        QString str_proc_output;
    
        Q_INVOKABLE void startProcess();
        Q_INVOKABLE void stopProcess();
    
        Q_INVOKABLE QString getOutput();
        Q_INVOKABLE void writeByte(QString str);
    
    
        Q_INVOKABLE QString getAllOutput();
    private:
    
    signals:
    
    public slots:
        void mReadyRead();
        void mReadyReadStandardOutput();
        void mFinished(int code);
        void mBytesWritten(qint64 written);
    
    };
    

    WrapperClass.cpp

    WrapperClass::WrapperClass(QObject *parent) : QObject(parent)
    {
        process = new QProcess();
        process->setProgram("untitled.exe");
        process->setProcessChannelMode(QProcess::MergedChannels);
    
        str_proc_output = "";
    
        connect(process, SIGNAL(readyRead()), this, SLOT(mReadyRead()));
        connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(mReadyReadStandardOutput()));
        connect(process, SIGNAL(finished(int)), this, SLOT(mFinished(int)));
        connect(process, SIGNAL(bytesWritten(qint64)), this, SLOT(mBytesWritten(qint64)));
    
    }
    
    void WrapperClass::startProcess() {
        if(process->state() == QProcess::Running) {
            stopProcess();
        } else {
            process->open(QProcess::ReadWrite);
        }
    }
    
    void WrapperClass::stopProcess() {
        process->close();
    }
    
    
    
    QString WrapperClass::getOutput() {
        return str_proc_output;
    }
    
    
    QString WrapperClass::getAllOutput() {
        QString str = process->readAll();
    
        std::cout << str.toStdString() << std::endl;
        return str;
    }
    
    
    void WrapperClass::writeByte(QString str) {
    
        char cArr[str.length()] = {};
    
        memcpy(cArr, str.toStdString().c_str(), str.length());
    
        QByteArray arr = QByteArray(cArr, -1);
        process->write(arr);
    }
    
    
    
    
    void WrapperClass::mReadyRead() {
        QString s = QString(process->readAll());
    
        std::cout << "ReadyRead: " << s.toStdString() << std::endl;
        str_proc_output = s;
    }
    
    void WrapperClass::mReadyReadStandardOutput() {
        QString s = QString(process->readAllStandardOutput());
    
        std::cout << "ReadyReadStandardOutput: " << s.toStdString() << std::endl;
    
    }
    
    void WrapperClass::mFinished(int code) {
        std::cout << "Process finished! (" << code << ')' << std::endl;
    }
    
    
    void WrapperClass::mBytesWritten(qint64 written) {
    
        std::cout << "Bytes written: " << written << std::endl;
    
    }
    

    Main.cpp

    int main(int argc, char *argv[])
    {
        QGuiApplication app(argc, argv);
    
        qmlRegisterType("com.example.WrapperClass", 0, 1, "WrapperClass");
    
        QQmlApplicationEngine engine;
        engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
        if (engine.rootObjects().isEmpty())
            return -1;
    
        return app.exec();
    }
    

    With registering the Cpp-Class to QML i'm able to trigger the read/write functions via Click-Events from QML-MouseArea or Button.

提交回复
热议问题