如何使用 c && 调用 c++ 函数将应用程序输出重定向到 Qt 中的 textEdit

Posted

技术标签:

【中文标题】如何使用 c && 调用 c++ 函数将应用程序输出重定向到 Qt 中的 textEdit【英文标题】:How to call a c++ function using c && redirect application output to textEdit in Qt 【发布时间】:2010-06-03 18:30:38 【问题描述】:

我正在尝试同时做几件事。我正在尝试做一件主要的事情:将 Qt Creator 控制台中显示的应用程序输出重定向到我的 GUI 上的 textEdit。但是,我需要在其中执行此操作的类是用 C 编写的,并且它的所有相关标头也在 C 中。有没有办法可以将输出重定向到 C 类中的 textEdit 中?

【问题讨论】:

C 没有课程 - 你能改写你的问题并更好地解释你想要做什么吗? 您的术语有点混乱。你有 C 的课吗? 我正在尝试将标准输出重定向到我的 GUI 上的文本区域。我的项目都是 C++(因为它是 Qt)。但是,我需要的输出是由 C 类(不是 C++)中的 printf 调用的。我需要一种能够访问 C 类中的 textarea 以重定向标准输出的方法。 【参考方案1】:

如果您可以修改 C 代码,您可以允许它进行回调,以便将文本发送到回调函数,而不是仅仅使用 printf 打印。例如,你可以有类似的东西:

void someFunctionInC
(
    /* other parameters ... */
    void (*printcallback)(const char* text, void* extra_arg),
    void* extra_arg
)

    /* ... */
    printcallback("Hello world\n",extra_arg); /* instead of using printf */
    /* ... */

然后,您可以在 C++ 中创建一个回调,将 void* extra_arg 参数转换回一个类,并使用给定文本调用该类的方法。另一种可能性是您可以使用snprintf 并创建C 函数的变体,该变体将打印到字符串而不是打印到标准输出。请注意,这些解决方案都要求您能够修改给定的 C 函数。如果绝对不可能修改 C 函数,您可以使用 close、pipe、dup2 等将 stdout 重定向到管道,然后从管道读回结果,但这是一个非常非常丑陋的解决方案。祝你好运。

【讨论】:

【参考方案2】:

见http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.8

【讨论】:

【参考方案3】:

接口 C++ 和 C 函数涉及解决 C++ 中默认发生的名称修改以支持函数重载。

要从 C 函数调用 C++ 函数,您必须使用 extern "C" 限定符声明 C++ 函数。这会指示编译器保持其名称不变。

要从 C++ 函数调用 C 函数,您必须在 C++ 函数范围内使用 extern "C" 对其进行原型化。

【讨论】:

【参考方案4】:

这有点老了,但是看看here。似乎QTextStream 是答案,但具体我不确定。

【讨论】:

【参考方案5】:

QProcess 是 QIODevice。如果您正在调用这个 C 程序,您可以使用 QProcess 并使用 QProcess::readAll* 成员从中读取它的输出

【讨论】:

以上是关于如何使用 c && 调用 c++ 函数将应用程序输出重定向到 Qt 中的 textEdit的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SWIG 在 C++ 中调用 python 函数?

Lua封装&C++实践—— C++调用Lua函数的封装

Lua封装&C++实践—— C++调用Lua函数的封装

Lua封装&C++实践—— C++调用Lua函数的封装

Lua封装&C++实践——Lua注册C++构造函数

Lua封装&C++实践——Lua注册C++构造函数