文章

顯示包含「PySide」標籤的文章

[Qt] PySide 如何 debug 沒有 stack trace 的 Segmentation Fault

圖片
雖然 PySide 是 open source 也很好用,但如果我們用 PySide 寫了一些有 bug 的程式,GUI 在做了某個操作後就會無預警 crash 消失不見,只留下哀傷的一行訊息在 console 上: Segmentation fault 現在是要怎麼 debug?  最近我就想用 QTableView + QAbstractItemModel 做一個可以動態新增資料的 table,但是以下的程式碼跑起來就會遇到 segmentation fault (完整的程式碼在文章最下面): from typing import Any, List import sys from PySide2 import QtCore, QtWidgets class DataModel(QtCore.QAbstractItemModel): ... class MainDialog(QtWidgets.QDialog): ... if __name__ == "__main__": ... 看了一下我也不知道問題在哪,我也不太曉得 QAbstractItemModel 哪幾個 functions 是一定要 override 的,現在該怎辦? 解法1: 暫時切換成 PyQt 當我們把一開始的 import 全部換成: from PyQt5 import QtCore, QtWidgets 再跑一次程式,這時候 GUI 不僅不會 crash,console 上還會多一行完整的訊息: NotImplementedError: QAbstractItemModel.index() is abstract and must be overridden Oh 原來我忘記要 override "index" function 了。 解法2: 用 gdb 來 debug 如果遇到提示還不夠明顯的狀況,我們可以用 gdb 來 debug。 等等! gdb 不是給 C++ 用的嗎? 和 Python 有什麼關係? 原來 PySide (Qt for Python) 只是像是用 Python 的殼把 Qt C++ 的程式碼包起來,詳細的運作原理可以參考  Qt for Python/Shibok...

[Side Project] 用 PySide2 (Qt Python) 實作 Prototype Pattern 與樂譜編輯器

圖片
最近讀書會剛好要報 Prototype Pattern,看了一下  Design Patterns: Elements of Reusable Object-Oriented Software 的 prototype 這章節。書中一開始動機說明一個五線譜的 GUI 編輯器,後面 sample code 卻是用像是 toy example 的迷宮,這樣真的兜不攏也看不太懂。 網路上找了一下也沒有人為了 prototype pattern 做五線譜的範例,剛好最近工作上會碰到 PySide2 ,於是我想想,乾脆來把五線譜的範例做出來順便練習一下 Qt 的 QGraphicsView 要怎麼使用,也順便展示 prototype pattern 的優缺點。 Side Project on  GitHub 簡單的樂譜編輯器 GUI Users 可以從左邊拖曳樂譜上的符號到右邊的畫板上,畫板 (canvas) 上的符號也可以事後再進行拖曳、旋轉。 就算簡單也該有的功能 為了讓範例簡單,我就只做了書中提到的 half note 和 whole note,不要加進一大堆其他符號來讓整個 example 複雜化。但相對地我們也不能弄得太簡單太像 toy example 看了沒感覺。 我就多做了幾個比較像 real project 的功能: 拖曳的符號會像是磁鐵一樣 snap to lines/spaces 到最近的五線譜線上或空格(間) 內 拖曳符號時我把預設有的圖示 (indicator) 隱藏,拖曳中 (dragging) 也看的到放開 (drop) 後的樣子 我限制拖曳的符號只能在畫板 (canvas) 中移動,不給使用者拖曳到不見或卡在邊邊一半 Prototype Pattern 優點 1: 可以 Reuse Framework 不用 prototype pattern 我們會怎麼做創 object 的 framework? 我們可能就會創出一大堆平行化的 GraphicTool ( 橘色 的部分) 用來造代表樂譜符號的 Graphic: 書中說 framework 不應該知道 application 任何細節才對,萬一今天 application 改成做遊戲地圖編輯器呢? 難道要創更多 GraphicTool? 那可能我們會先發瘋。 所以 prototy...

此網誌的熱門文章

[試算表] 追蹤台股 Google Spreadsheet (未實現損益/已實現損益)

用 100% code coverage 讓自己設計品質好的軟體

[LeetCode] 用更簡單的方式分析與解決 #11 Container With Most Water