pyqt5 model/view框架 3.可編輯項
# -
*- coding: utf-8-
*-import sys
import sys
from pyqt5.qtgui import qfont
from pyqt5.qtwidgets import *
from pyqt5.qtcore import *
import sys
class mylistmodel
(qabstractlistmodel)
:"""
我的第乙個模型
"""def __init__
(self,parent=none)
:super
(mylistmodel,self)
.__init__
(parent)
#這是資料
self._data=[70
,90,20
,50] pass
def createeditor
(self, parent, option, index)
: ret = qstyleditemdelegate.
createeditor
(self, parent, option, index)
print
(ret)
#>
return ret
def rowcount
(self, parent=
qmodelindex()
):""" 這個方法返回了資料的行數
也就是有多少個條目得資料
"""return
len(self._data)
def data
(self,index,role=qt.displayrole)
:"""
根據當前index索引,返回當前的資料
然後再由qt進行渲染顯示
"""#如果當前得索引是不活動得
if not index.
isvalid
() or not 0
<= index.
row(
)< self.
rowcount()
: #亦或者當前的索引值不在合理範圍,即小於等於0,超出總行數
return
qvariant
() #返回乙個qvariant,相當與空條目
#從索引取得當前的航號
row=index.
row(
) #如果當前角色是displayrole
if role==qt.displayrole:
#返回當前行的資料
return self._data[row]
#當前角色為編輯模式,顯示原本資料
#這樣,當我們雙擊單元項時,不至於什麼都不顯示
if role==qt.editrole:
return self._data[row]
#如果角色不滿足需求,則返回qvariant
return
qvariant()
def flags
(self, index)
:"""
flag描述了view中資料項的狀態資訊
"""#首先獲取超類的flags返回值
flag=
super
(mylistmodel,self)
.flags
(index)
#或運算,將itemiseditable(可編輯)標誌疊加上去
return flag | qt.itemiseditable
def setdata
(self,index,value,role=qt.editrole)
:"""
設定資料
"""print
('mylistmodel setdata'
, index.
column()
, index.
row())
#如果當前為編輯角色
if role == qt.editrole:
# print("setdata qt.editrole")
# print(type(value))
# print(value)
#qvariant的這個方法,返回的bool型別表示這個值是否可以被轉為int型別
value_int = value
#儲存資料
self._data[index.
row()]
=value_int
#發射資料更改訊號,以便讓view更新
self.datachanged.
emit
(index,index)
#資料是否成功更新
return true
class mydelegate
(qstyleditemdelegate)
:"""
自定義的委託
用來在model獲取後,view顯示前,再將資料渲染一次
"""def __init__
(self, parent=none)
: qstyleditemdelegate.
__init__
(self, parent)
self.opts=
qstyleoptionprogressbar()
def paint
(self,painter,option,index)
:"""
paint,有了畫布畫筆,想怎麼顯示就怎麼顯示,畫什麼按自己的想法來
"""if true:
#print('mydelegate paint', index.column(), index.row())
# print(type(index))
# print(type(index.data(qt.displayrole)))
# print(index.data(qt.displayrole))
#首先,從索引獲取資料,這裡獲取當前索引角色為displayqole的資料
# item_var=index.data(qt.displayrole) #[qvariant]
# #資料是c格式,我們再轉為python格式,記住這點
# item_str=item_var.topyobject() #[qvariant] -> str
#我們將資料以進度條的方式顯現
self.opts.rect = option.rect #進度條所佔的矩形大小
self.opts.minimum =
0 self.opts.maximum =
100 self.opts.text =
str(index.
data
(qt.displayrole)
) #顯示的內容
self.opts.textalignment = qt.aligncenter
self.opts.textvisible = true
self.opts.progress=
int(index.
data
(qt.displayrole)
) #設定當前進度
#這是關鍵
style()
.drawcontrol
(qstyle.ce_progressbar,self.opts,painter)
else
: qstyleditemdelegate.
paint
(self, painter, option, index)
def main()
:(sys.ar**)
#新建乙個自定義model
model=
mylistmodel()
#新建乙個委託(delagate)
delegate=
mydelegate()
#新建乙個listview
view=
qlistview()
#設定view的model
view.
setmodel
(model)
#設定view的delegate
view.
setitemdelegate
(delegate)
view.
show()
sys.
exit
exec_()
)if __name__ ==
"__main__"
:main
()
執行效果:
PyQt5 標準輸入框QInputDialog
from pyqt5 import qtwidgets from pyqt5.qtwidgets import qlineedit,qinputdialog class mywindow qtwidgets.qwidget def init self super mywindow,self init...
pyqt5 拖拽繪製矩形框
博主想自己做乙個標註工具,用於製作目標檢測資料集,其中乙個功能就是拖拽滑鼠選中矩形區域,參考了幾篇部落格,自己實現了一下,效果如下 下面是實現 import sys,math from pyqt5.qtgui import from pyqt5.qtwidgets import from pyqt5...
Python Qt(二)PyQt5 GUI程式框架
pyqt5編寫gui程式包括gui應用程式的基本框架 ui designer視覺化設計窗體的方法 窗體檔案如何轉換為python檔案並使用和qt的訊號與槽技術的使用方法等。用ui designer視覺化設計窗體 將ui檔案編譯為py檔案 使用ui formhello類的gui程式框架 介面與邏輯分離...