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

2024-04-27

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

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

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

它主要用于Windows。

感谢您的帮助。


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

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

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

包装类.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);

};

包装类.c++

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 中的点击事件触发读/写功能MouseArea or Button.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建 QT 应用程序作为 Windows 上现有基于控制台的应用程序的 GUI 的相关文章

随机推荐

  • iOS App 中 AVAudioPlayer 和 MPMusicPlayerController 的独立音量控制。

    在我的应用程序中 我使用 AVAudioPlayer 播放下载的音频 同时使用 MPMusicPlayerController 播放用户 iPod 音乐库中的音频 我需要能够调整 AVAudioPlayer 实例的音量 使其声音更大 比来自
  • 为什么 GCC 9.1.0 有时会抱怨 strncpy() 的这种使用?

    这是一个 40 行 MCVE 最小 完整 可验证的示例 https stackoverflow com help mcve 或者接近最小的东西 从最初包含 32 个标头的 1675 行源文件中删减 其中大多数包含多个其他标头 编译它gcc
  • gcc 如何知道内联汇编中使用的寄存器大小?

    我有内联汇编代码 define read msr index buf asm volatile rdmsr d buf 1 a buf 0 c index 使用该宏的代码 u32 buf 2 read msr 0x173 buf 我发现反汇
  • 如何在活动脚手架导轨 3 中添加新链接

    我需要在我的出租车列表页面中添加一个新链接 地图 我使用的是 active scaffold 和 Rails 3 2 1 我当前的页面如下所示 我需要在每条记录中显示类似于编辑 删除 显示的链接 地图 在我的数据库中 我有字段名称 纬度 经
  • 你怎么知道无限长的承诺链何时完全结束?

    我试图使用 Promise 强制序列化一系列 Ajax 调用 用户每次按下按钮时都会进行这些 Ajax 调用 我可以成功地序列化操作 如下所示 sample async function real world this is an Ajax
  • 在 MS 企业库或 Log4net 等第 3 方组件上创建包装器是一个好习惯吗?

    这更像是一个很好的练习题 我想提供不同的通用库 如日志记录 缓存等 有很多第三方库 如 MS 企业库 log4Net NCache 等 我想知道直接使用这些服务或在每个服务上创建包装器并使用 DI 在代码中注入该服务是否是一个好习惯 reg
  • C++ iostream 的自定义操纵器

    我想为 ostream 实现一个自定义操纵器 以对插入流中的下一个项目进行一些操作 例如 假设我有一个自定义操纵器quote std ostringstream os std string name Joe os lt lt SELECT
  • pandas 中的索引对象——为什么 pd.columns 返回索引而不是列表

    来自 R 背景 我发现 非常高 使用Indexpandas 中的对象有点令人不安 例如 如果train是一个pandas DataFrame 有什么特殊原因吗train columns应该返回一个Index而不是一个列表 如果它是一个Ind
  • 如何在 Android 上检测从 3g 到 H+ 的网络类型更改

    通过连接管理器和广播接收器 我能够获取连接和断开连接事件 如下所述埃里克的帖子在这里 https stackoverflow com questions 1783117 network listener android 我想知道的是网络连接
  • IntelliJ IDEA 在项目 jar 中查找类

    我看过一些关于通过在目录中搜索 jar 来查找类的帖子 这让我认为 IntelliJ IDEA 中一定有一个工具可以做到这一点 有人知道这样的工具以及如何使用它吗 如果 jar 文件作为项目依赖项导入 您可以键入cmd n然后搜索它
  • ROS中spin和rate.sleep的区别

    我是 ROS 新手 正在尝试了解这个强大的工具 我很困惑spin and rate sleep功能 谁能帮助我了解这两个功能之间的区别以及何时使用每个功能 ros spin and ros spinOnce 负责处理通信事件 例如到达的消息
  • Java EE / Jakarta EE 支持 Java 模块系统吗?是否可以使用Java模块系统制作Web应用程序?

    我正在使用 Java 11 和 Maven 3 6 1 构建我的第一个模块化应用程序 我的IDE是IntellijIDEA 2019 1 3 我添加了一个模块 app 并添加module info java 但我很困惑 因为即使我向应用程序
  • fork 和现有线程?

    在linux系统上 子进程查看现有线程的方式与父进程相同吗 int main create thread 1 int child pid fork if 0 child pid else 由于子进程复制了整个地址空间 因此线程的状态会发生什
  • 如何在节点中转义 shell 命令的字符串?

    In nodejs http nodejs org 执行外部命令的唯一方法是通过 sys exec cmd 我想调用外部命令并通过标准输入为其提供数据 在nodejs中 似乎还没有一种方法可以打开命令 然后将数据推送到它 仅执行并接收其标准
  • 查找游戏对象的子对象的子对象

    我在场景中有一个预制件 我想访问该预制件的子项 该预制件的结构如下 PauseMenu UI Resume TextField TextField2 UI Side Back lt I need this child UI Home tra
  • 如何 adb 提取 SD 卡中文件夹中的所有文件

    我的 SD 卡中有一个文件夹 mnt sdcard Folder1 Folder2 Folder3 jpg 文件夹 1 和文件夹 2 的名称保持不变 文件夹 2 内有文件夹 3 4 5 等 我想使用 adb 将所有 jpeg 文件而不是所有
  • 具有多个数据源的 Spring Boot + JNDI

    我尝试创建一个 Spring Boot 应用程序 它连接两个数据源 我能够通过遵循 Spring 文档来实现这一目标 但我面临的挑战是实现以下目标 通过使用 Spring Boot DataSourceAutoConfiguration 通
  • Baqend 中的关系和 ACL

    我试图弄清楚 baqend 是否可以做到这一点 或者甚至是正确的方法 我有很多用户 使用 Baqend 附带的默认用户帐户系统 其中一些用户将是公司的管理员 一家公司将拥有 1 到 5 名管理员用户 有一个单独的数据类 其中包含公司的记录和
  • 数据库连接未使用 jpaFlowExecutionListener 关闭

    我正在使用 Spring Web Flow 来构建应用程序 我正在利用Flow Managed Persistence Context因此实体管理器在流程执行期间保持打开状态 我可以访问延迟加载的属性 类似于OpenEntityManage
  • 创建 QT 应用程序作为 Windows 上现有基于控制台的应用程序的 GUI

    我正在尝试使用 Qt 为现有应用程序设置一个 GUI 该应用程序旨在在 Windows 命令行中运行 这不仅仅是运行应用程序system 命令 但我需要通过命令行与现有应用程序交互 The system 当我启动现有的可执行文件时 命令会阻