gpt4 book ai didi

c++ - 在 Windows 上为现有的基于控制台的应用程序创建 QT 应用程序作为 GUI

转载 作者:行者123 更新时间:2023-11-30 03:30:07 25 4
gpt4 key购买 nike

我正在尝试使用 Qt 为现有应用程序设置一个 GUI,该应用程序将在 Windows 命令行中运行。它不仅仅是运行应用程序system() 命令,但我需要通过命令行与现有应用程序交互。

当我启动现有的可执行文件时,system() 命令会阻止 GUI。我如何在后台运行这个可执行文件并通过我自己的 GUI 元素(例如按钮)触发一些输入?

我想为我的一些同事简化此命令行工具的使用。

主要用于windows。

感谢您的帮助。

最佳答案

我找到了满足我需求的解决方案,可以做我想做的事。实际上我有点失望。我认为这会更复杂。

首先我不得不说这是一个 QtQuick 应用程序..也许我应该早点说。

我只是将流程功能外包给了另一个类(class)。此类通过 qmlRegisterType<>() 传递给 QML功能。我将来自进程 ( QProcess ) 的一些信号连接到我自己的类中的槽,并编写了我自己的函数来处理从控制台应用程序读取数据/向控制台应用程序写入数据。使用 QML- onClicked事件我可以将我的参数和字符串传递给控制台应用程序。通过一些应用程序逻辑,我可以处理输入/输出请求和时间。

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<WrapperClass>("com.example.WrapperClass", 0, 1, "WrapperClass");

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;

return app.exec();
}

通过将 Cpp 类注册到 QML,我能够通过来自 QML 的点击事件触发读/写功能- MouseAreaButton .

关于c++ - 在 Windows 上为现有的基于控制台的应用程序创建 QT 应用程序作为 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45206540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com