Pyqt5 Model view框架 3 可編輯項

2021-10-06 04:33:08 字數 4456 閱讀 4493

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程式框架 介面與邏輯分離...