2010-06-03 79 views
1

我試圖一次做幾件事。我正在嘗試做一件重要的事情:將Qt Creator控制檯中顯示的應用程序輸出重定向到我在GUI上的文本編輯器。然而,我需要這樣做的類是用C語言編寫的,它的所有相關頭文件也都用C語言編寫。有沒有辦法可以將輸出重定向到C類中的textEdit?如何調用C++函數使用c &&重定向應用程序輸出到Qt中的文本編輯

+3

C沒有類 - 您能否更改您的問題並更好地解釋您正在嘗試執行的操作? – 2010-06-03 18:33:17

+1

您的術語有點混亂。你在C上有一堂課? – 2010-06-03 18:33:25

+0

我想在我的GUI上將stdout重定向到我的textarea。我的項目全部使用C++(因爲它是Qt)。但是,我需要的輸出是由printf在C類(而不是C++)中調用的。我需要一種方法來訪問C類中的textarea,以重定向stdout。 – 2010-06-03 21:48:31

回答

2

如果你可以修改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++中,創建鑄無效* extra_arg參數恢復到類,並調用給定文本類的方法的回調。另一種可能性是您可以使用snprintf並創建C函數的變體,該函數將打印到字符串而不是打印到標準輸出。請注意,這些解決方案都要求您能夠修改給定的C函數。如果絕對不可能修改C函數,那麼可以使用close,pipe,dup2等將stdout重定向到管道,然後從管道讀回結果,但這確實是一個非常糟糕的解決方案。祝你好運。

1

C++和C函數的接口涉及解決在C++中默認發生的名稱改變以支持函數重載。

要從C函數調用C++函數,必須聲明C++函數extern「C」限定符。這指示編譯器將其名稱保持不變。

要從C++函數中調用C函數,必須在C++函數的範圍內使用extern「C」進行原型設計。

0

這是有點老,但看看here。這似乎是QTextStream是答案,但具體我不確定。

0

QProcess是QIODevice。如果您正在調用此C程序,您可以使用QProcess並使用QProcess :: readAll *成員讀取它的輸出

相關問題