2010-11-06 48 views
27

每當我用一些圖形工具包開始一個項目時,最初的衝突之一就是如何處理視覺設計和小部件佈局:圖形工具還是手動編碼?Qt Designer vs Handcoding

這是一個非常棘手/主觀的問題,因爲大多數人會根據個人喜好來決定。它也很大程度上取決於圖形工具的質量。在這種情況下,我想專注於最新版本的QT庫。我不打算討論哪種方法更好。我相信最好的答案是:取決於項目。

我想要的是一個很好的非偏見文章的參考,基於幾個項目後的經驗。這篇文章應該只是描述兩種選擇的權衡

回答

29

我開始做所有的手工編碼,最近已經開始使用Qt Designer來處理大多數表單。下面是每個位置的一些優勢:

使用Qt設計

  • 我是管理複雜的佈局,最大的節省時間;它節省了繁瑣編碼的批次。簡單地(非常粗略地)安排您的小部件,選擇它們,右鍵單擊並將它們放入正確的佈局中。特別是隨着佈局嵌套,這是,所以更容易。
  • 它傾向於保持您的實現文件清潔,而不是用所有的樣板佈局代碼填充它們。我是A型,所以我喜歡那樣。
  • 如果您正在翻譯您的應用程序,可以向您的翻譯人員發送.ui文件,以便他們可以在您的GUI上使用看到,在那裏他們翻譯的文本將會是。 (假設他們正在使用Qt語言學家。)

手工編碼

  • 控制。如果你有一個需要按照特定順序實例化/初始化控件的佈局,或者根據其他條件(數據庫查找等)動態創建控件,這是最簡單的方法。
  • 如果您有自定義小部件,您可以使用Designer進行排序,添加您的類派生的最接近的內置QWidget,然後「升級」它。但是,除非您將它設計爲單獨項目中的設計器插件,否則您將不會看到您的小部件的預覽,這對於大多數使用情況來說工作量太大。
  • 如果您的自定義窗口小部件的構造函數中的參數超出了可選的QWidget父窗口,Designer無法處理它。您別無選擇,只能手動添加該控件。

其他

  • 使用自動連接插槽和信號特徵(根據命名規則,如「on_my_button_clicked」)。我發現,我幾乎總是有在確定的時間建立這個連接,而不是每當Qt爲我做。
  • 對於QWizard表單,我發現我需要爲每個頁面使用不同的UI文件。您可以一次完成所有工作,但以任何類型的自定義方式在頁面之間進行通信變得非常尷尬。

總之,我從Qt Designer開始,讓它儘可能地帶我,然後從那裏手工編寫代碼。這是Qt Designer生成的一件好事 - 它只是成爲類的一員的另一個類,您可以根據需要訪問它並對其進行處理。

+1

使用手工編碼時,如果以正確的方式進行操作,則不存在樣板佈局代碼。這些都隱藏在你的UI構建類中。翻譯也很容易,因爲您可以使用來自相同UI構建類的文本生成模型。 – 2012-02-15 15:17:45

4

我傾向於使用設計器佈局對話框,但我在主代碼中執行所有事件處理。我也做直接代碼中的所有主窗口,工具欄,菜單。

設計師只是令人沮喪的 - 可惜,因爲體面的拖放式分級機基於設計師已經存在了十多年

+0

+1瞭解。我也在主代碼中完成了所有的事件處理工作,但隨着時間的推移,這引起了一個巨大的部分,它爲「小部件」提供了「連接」語句。最近,我決定儘可能多地(即與非動態控制)與設計師(我承認這是一個痛苦)。至少在這種情況下,GUI和代碼有進一步的分離。順便說一下,對於動態控件,我嘗試在設計器中使用虛擬控件,並將其推廣到實際的類,所以我可以通過打開ui文件來獲得關於GUI的感覺。 – dashesy 2012-02-15 00:55:05

0

我用兩者的結合:

  1. 我找到對於x,y座標,設計師是要走的路。

  2. 許多其他UI屬性等可以在您的代碼中設置。

我認爲試圖完全通過手工編寫UI將是一個非常耗時的項目。這不像設置HTML表格那麼簡單。

是的版本4是壞的,但在工作中使用過版本3的人說這是非常糟糕的。很多的崩潰。

我和我的QTers一起真的希望版本5會有所改進。

我知道這是一個老問題,但我希望這有助於!一個人的經驗。

+1

我從來沒有理由使用x,y座標。 Qt佈局功能強大。如果使用x和y座標,當窗口重新調整大小時會發生什麼? HTML在這裏是一個很差的類比,因爲你不應該使用HTML表格來做佈局。將Qt的佈局與CSS比較會更有意義。 – 2012-02-09 19:50:58

13

我的答案基於兩年來使用PyQt4(Python綁定到Qt 4)和OpenGL開發生物化學應用程序。我沒有完成C++ Qt,因爲我們只使用C++來處理性能關鍵的算法。也就是說,PyQt4 API非常類似於Qt4,這裏仍然適用。

Qt設計

    • 探索。發現可用的小部件,這些小部件的名稱,可爲每個小部件設置的屬性等。
    • 強制將UI邏輯從應用程序邏輯中分離出來。
    • 如果需要添加或刪除在運行時間部件,你必須有在代碼中的邏輯。我認爲把你的UI邏輯放在兩個地方是一個壞主意。
    • 對嵌套佈局進行更改。當佈局中沒有小部件時,它會崩潰,並且將小部件拖放到所需位置非常困難。

手工編碼

    • 快,如果你非常熟悉的Qt。
    • 如果您需要在運行時添加或刪除小部件,則爲最佳選擇。
    • 如果您有自己的自定義小部件,比Qt Designer更容易。
    • 有了紀律,您仍然可以將UI佈局與行爲分開。只需將您的代碼創建並在一個位置佈置小部件,然後使用您的代碼在另一個位置設置信號和插槽即可。
    • 慢,如果你是新來的Qt。
    • 不是強制執行佈局與行爲的分離。

提示

  • 不要只是跳進創建窗口。首先快速勾畫幾種可能的設計,無論是在紙上還是使用像Balsamiq Mockups這樣的工具。儘管你可以在Qt Designer中做到這一點,但我認爲在你甚至決定它是否是最好的設計之前花費大量時間試圖讓你的窗戶看起來太過誘人。

  • 如果你使用Qt Designer進行PyQt,你需要額外的步驟來運行pyuic4來編譯* .ui文件到Python源文件。我發現忘記這一步很容易,並且爲了我的更改無法正常工作而搔首弄姿。

  • 如果您手工編寫您的用戶界面,我建議將您的佈局代碼放在一個地方,並將您的信號和插槽放在另一個地方。這樣做可以更輕鬆地改變窗口小部件在窗口上的排列方式,而不會影響任何應用程序邏輯。或者你可以改變一些行爲,而不必通過所有的佈局代碼。

享受Qt!現在我正在使用Java Swing工作,我很想念它。

0

這取決於您的應用程序所需的不同窗口/面板的數量。如果數字很小,請使用圖形工具。獲得完美設計的幾個窗口要快得多。如果數字很大,圖形工具可以(也應該)僅用於原型。您需要對佈局進行編碼,才能以可接受的成本進行應用範圍內的更改。

這包括創建應用程序的UI如何工作的模型以及在運行時動態添加和刪除小部件。對於這種模型的一個很好的例子(在不同的環境中),請看glamour model來創建對象瀏覽器。

我反對這個建議,它是棘手/主觀的(至少比其他發展選擇更多)。拿出決定的標準很容易。個人經驗和偏好對此非常重要,因爲他們決定何時應該將不同窗口的數量視爲較小。刀具質量也是如此。