2011-07-20 63 views
6

對於那些編寫了相當複雜的PyQt應用程序的人,您會提供哪些提示和技巧來加速應用程序?我有我的程序開始的地方,因爲它變大放慢了幾個例子:優化您的PyQt應用程序

  • 我有一個「儀表盤」撰文指出,被破壞並重新創建時就在TreeWidget的項目的用戶點擊。單擊TreeWidget中的項目更改儀表板,但不需要銷燬小部件並重新創建它的模塊化界面,更好的方法是什麼?

  • 每個儀表板還從網絡位置加載圖像。這會在應用程序周圍導航時產生一些放緩,但在將其加載到內存中後,「回到同一個短劃線」的速度會更快。有沒有一種好的方法或方法可以在程序加載時運行線程,以便將圖像預加載到內存中?如果是這樣,你怎麼實現呢?

  • 當你有大量的儀表板項目和數據被加載到它們中時,你們是否通常線程化數據加載並將其加載回來,每個線程完成?當有人快速瀏覽時,這是否可行?會爲線程實施kill-switch,以便當用戶更改儀表板時,線程會死機?或者,不斷創建和殺死線程會導致某種好的崩潰。

對不起,我的問題的巨大攻勢,但他們似乎相似,足以保證捆綁在一起。

回答

7

我不確定這是否與您正在做的完全相同,但它聽起來與我在某些應用程序中有某些自定義小部件列表相似。當你創建和銷燬大量小部件時,它確實會顯着減慢速度。

如果它的總小部件數量較少,但只是被創建和刪除了很多,您可以只創建一次小部件,並且只更改這些小部件的數據,因爲信息需要更新......反對每次信息變化時創建新的小部件。這樣,您甚至可以更改線程中的數據,而無需擔心創建窗口小部件。

另一種情況是您顯示帶自定義小部件的列表,並且存在TON結果。我注意到,當您在列表中有1000個自定義小部件時,它總是放慢速度。我的同事提出的一個竅門是,在顯示器中使用靜態數量的插槽時,會出現一種假冒列表。比方說,它在視圖中顯示了10個插槽。滾動條不會真正向下滾動到MORE小部件中......它所做的是滾動通過10個可見小部件的DATA。你可以瘋狂地提高性能。但只有在您的應用程序是可接受的顯示樣式時才適用。

+0

一個necro的位,但這是我結束的方法。接受答案! – Cryptite

1

你使用QNetworkAccessManager加載你的圖片嗎?它有緩存支持。它也加載一切在後臺完成回調。

我真的不明白你的儀表板在做什麼。你有沒有想過使用QWebkit?也許你的儀表板內容很容易在HTML中實現?

PS。我不喜歡Python中的線程,也不認爲它們是好主意。委託給Qt核心的延期工作比較好。

+1

與延期工作相比,Python中的線程有什麼缺點? – Remi

+0

總的來說,我對PyQt的深層次方面還是比較陌生的。我的應用程序是桌面應用程序,QNAM和QWebkit也適用?猜猜我想弄清楚如何在開始時預加載圖像,然後有一個庫調用,同時避免圖像未加載時發生某種衝突。 我只是使用術語'儀表板'來描述一個QWidget,裏面有各種小部件,比如QLabel中填充了圖像以及更多標籤,這些標籤的數據是從xml文檔加載的。 – Cryptite

+0

如果您的圖片只需要在啓動時加載一次,那麼您可以在初始化期間將所有QPixmaps創建一次到字典中。然後它是線程安全的交換出來的部件。你只是不能從線程創建它們。 – jdi