0

您可以使用 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 的模型。

为什么会这样?该模型何时可用?

4

1 回答 1

1

单独的 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
于 2022-01-06T13:43:31.387 回答