2009-12-05 14 views
0

我有一個GUI應用程序,裏面創建一個QProcess,捕獲它的輸出並在窗體上顯示它。我需要以某種方式捕獲表單中的關鍵事件,將它們傳遞給QProcess(使其儘可能接近真正的終端窗口)。透明地將Keyboad事件傳遞給QProcess的推薦方式是什麼?

所以,我想,我應該處理keyReleaseEvent()並以某種方式變換或者event.text()(這是QString)或event.key()(這是int)到參數,適合process.write()(這需要char*QByteArray)。是否有推薦的方式來做這樣的轉換(考慮到本地化問題,ctrl/alt/shift修飾符等)?我真的不想構建某種從key()返回值到char*字符串的映射;和text()滴修飾符。

而且,如果我在QProcess中開始命令bash -c sudo something過程,它立即退出,抱怨說「沒有TTY出現,也沒有askpass程序規定」,所以我可能會做一些完全錯誤的...

+1

只是評論,因爲這並沒有回答主要問題。要處理「no tty ...」問題,您可以確保使用QProcess :: setEnvironment(http://doc.trolltech.com/4.6/qprocess.html#setEnvironment)設置SUDO_ASKPASS環境變量。它必須設置爲要運行的程序的路徑,該路徑需要參數(提示符)並將密碼寫入標準輸出。 – imaginaryboy 2009-12-05 07:20:10

+0

我不希望爲每個超偏執的程序設置一些深奧的變量......我希望有一種通用的方式使我的QProcess的行爲完全像終端應用程序。 – fjarri 2009-12-05 07:35:47

回答

2

問題不僅僅是決定寫入流程的內容。

您不能通過讀取/寫入進程的stdout/stdin來模擬終端,它比這更復雜。例如,考慮程序less或任何尋呼機。它如何知道一次打印多少行?它需要關於未通過stdin/stdout/stderr表示的終端的信息。

仿真終端超出了QProcess的範圍。如果您確實需要這樣做,那麼請使用一些現有的基於Qt的終端仿真器作爲起點(例如Konsole)。

+0

是的,Konsole似乎正在做我想做的事......我可能不得不從它切下一些部分) – fjarri 2009-12-06 12:48:04

相關問題