您可以使用 self.model() 訪問 Headerview 的底層模型,但是當您在建構式中使用它時,它會回傳 None。
例如,這將列印“無”
class MyHeaderView(QHeaderView):
def __init__(self, orientation, parent):
super().__init__(orientation, parent)
print(self.model())
Headerview 是在 QTableView 子類的建構式中設定的,當時該子類已經設定了模型。
self.setHorizontalHeader(MyHeaderView(Qt.Horizontal, self))
所以它應該能夠在構建程序中知道它的模型是什么,但它似乎不知道。當 GUI 運行時,可以毫無問題地訪問 headerview 的模型。
為什么會這樣?該模型何時可用?
uj5u.com熱心網友回復:
單獨的 parent 引數不足以設定模型(因為父級可以是任何型別的小部件,而不僅僅是專案視圖),但添加它以便使用小部件的樣式正確“初始化”它很重要,調色板,字體等
只有在視圖上設定了標題(setHeader()對于樹視圖setHorizontalHeader()和setVerticalHeader()表格)時,才實際設定模型,但前提是標題上尚未設定其他模型。
setModel()在視圖上呼叫模型時再次設定模型,在這種情況下,任何以前的模型都將替換為標題的新模型。
如果您想對模型做一些事情(例如,在添加/洗掉/移動行或列時連接到自定義函式),您應該覆寫setModel()視圖:
class MyHeaderView(QHeaderView):
def setModel(self, newModel):
currentModel = self.model()
if currentModel == newModel:
return
elif currentModel:
currentModel.rowsInserted.disconnect(self.myFunction)
currentModel.rowsRemoved.disconnect(self.myFunction)
currentModel.rowsMoved.disconnect(self.myFunction)
super().setModel(newModel)
if newModel:
newModel.rowsInserted.connect(self.myFunction)
newModel.rowsRemoved.connect(self.myFunction)
newModel.rowsMoved.connect(self.myFunction)
def myFunction(self):
# do something
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/407443.html
標籤:
