2014-10-02 61 views
7

QT似乎是可用的最佳跨平臺GUI工具包。不幸的是,它是用C++編寫的,並且它與許多有趣的語言(如D,Rust,Julia和* nix上的Mono)的綁定不是可用或不可維護的。 GTK綁定通常是可用的,但GTK在Windows和(特別是)OS X上看起來很醜。wxWidgets綁定也很好,但對於D,Rust和Julia不可用或者無法維護(對於Julia,我可以通過Python這兩個工具包,但這是緩慢和笨拙)。如何將QT GUI加入到非C++主程序中?

如何將我的C++ GUI綁定到非C++主程序?

+2

把你的Qt例程換成C函數;大多數語言實現接受C外部函數。你在想什麼確切的語言? – 2014-10-02 14:10:28

回答

9

這裏有幾個選項。

首先,您可以通過C API綁定您的GUI和主應用程序。圖形用戶界面通常通過通過事件循環調用的回調來完成,因此您必須將高級語言中的函數作爲C回調來公開,以便從事件循環中調用它們。然後你將需要啓動Qt事件循環。根據您使用的語言,有多種方法可以完成此操作。例如,如果使用Rust,則可以創建一個靜態或動態庫,並將C++ GUI程序鏈接到它。在這種情況下,程序的「入口點」將成爲C++部分。如果你使用類似Julia的東西,你可能會想將C++部分編譯爲一個庫,這個庫也會暴露一個調用Qt事件循環的函數。因此,在這種情況下,「入口點」將是您的更高級別的部分,仍然需要調用回C++庫。

第二種方法更接近Web UI。您可以使您的GUI成爲用其他語言編寫的主應用程序的客戶端。他們可以通過HTTP等現有協議交換消息,也可以通過低級TCP或UDP連接實現自己的協議,也可以使用「中級」消息庫,如ZeroMQnanomsg。您也可以考慮完全放棄Qt,只需編寫一個Web應用程序,將您的程序作爲Web服務器。這是現在編寫GUI最跨平臺的方式,我想:)

+0

如果我想將UI看作可能稍後會被重寫的模塊化組件(比如本機外觀),第二種方法會是最好的嗎? – Demi 2014-10-03 18:25:51

+0

@Demetri,我相信是的,因爲它會比直接C綁定更分離。 – 2014-10-03 21:10:18

+0

因此,對於所有這些選項,在以下情況下,速度差異(在將數據從GUI傳遞到後端,後端處理到將結果傳遞迴GUI進行渲染時)有什麼影響: 1.使用相同語言的GUI和後端(例如Qt和C++) 2.不同語言的GUI和後端(如C++ Qt/Julia) 3.其中GUI在瀏覽器中呈現,其中程序作爲服務器的Web應用程序 什麼是配置這些選項的好方法? – Asy 2016-01-30 19:59:08