什么是horizo ntalHeaderItem

问题描述 投票:2回答:1

我正在按照一些例子用单元格内的按钮构建QTableWidget,并建议使用QTableWidget.horizo​​ntalHeaderItem。现在,这很好但有了它我无法从特定的行/列返回项目(因为QTableWidget.horizo​​ntalHeaderItem没有指定的行)。

但是QTableWidget.horizo​​ntalHeaderItem的实际目的是什么?为什么我会使用它代替QTableWidget.item?

简单的PyQT5代码:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")

        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.mainWidget = QtWidgets.QWidget()
        self.mytable = QtWidgets.QTableWidget(self.mainWidget)

        self.mytable.setColumnCount(1)
        self.mytable.setRowCount(2)

        self.my_edit_btn = QtWidgets.QPushButton('Edit')
        self.my_edit_btn.clicked.connect(self.button_A_pressed)
        self.mytable.setCellWidget(0, 0, self.my_edit_btn)
        item = QtWidgets.QTableWidgetItem()
        self.mytable.setHorizontalHeaderItem(0, item)
        self.mytable.horizontalHeaderItem(0).setText("Edit")
        # self.mytable.setItem(0, 0, item)
        # self.mytable.item(0, 0).setText("Edit")

        self.my_edit_btn = QtWidgets.QPushButton('Edit')
        self.my_edit_btn.clicked.connect(self.button_B_pressed)
        self.mytable.setCellWidget(1, 0, self.my_edit_btn)
        item = QtWidgets.QTableWidgetItem()
        self.mytable.setHorizontalHeaderItem(0, item)
        self.mytable.horizontalHeaderItem(0).setText("Edit")
        # self.mytable.setItem(1, 0, item)
        # self.mytable.item(1, 0).setText("Edit")

        self.verticalLayout.addWidget(self.mytable)
        MainWindow.setCentralWidget(self.centralwidget)

        item = self.mytable.item(0, 0)
        print(item)
        item = self.mytable.takeHorizontalHeaderItem(0)
        print(item)
        item = self.mytable.takeItem(0,0)
        print(item)

    def button_A_pressed(self):
        print("Button A")
        button = QtWidgets.qApp.focusWidget()
        print(button.pos())
        index = self.mytable.indexAt(button.pos())
        item = self.mytable.itemFromIndex(index)
        print(item)

    def button_B_pressed(self):
        print("Button B")
        button = QtWidgets.qApp.focusWidget()
        print(button.pos())
        index = self.mytable.indexAt(button.pos())
        item = self.mytable.itemFromIndex(index)
        print(item)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

最后,我想根据特定的行/列值手动创建QModelIndex。我找到'indexFromItem'方法,但在使用QTableWidget.horizo​​ntalHeaderItem时我无法获得特定项目。

python pyqt pyqt5 qtablewidget
1个回答
3
投票

如果删除使用horizo​​ntalHeaderItem()和setHorizo​​ntalHeaderItem()的逻辑部分,则代码将继续工作,因此使用这些元素永远不会解决您的问题。要验证这一点,请使用以下代码替换setupUi()方法:

def setupUi(self, MainWindow):
    MainWindow.setObjectName("MainWindow")

    self.centralwidget = QtWidgets.QWidget(MainWindow)
    self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
    self.mainWidget = QtWidgets.QWidget()
    self.mytable = QtWidgets.QTableWidget(self.mainWidget)

    self.mytable.setColumnCount(1)
    self.mytable.setRowCount(2)

    self.my_edit_btn = QtWidgets.QPushButton('Edit')
    self.my_edit_btn.clicked.connect(self.button_A_pressed)
    self.mytable.setCellWidget(0, 0, self.my_edit_btn)

    self.my_edit_btn = QtWidgets.QPushButton('Edit')
    self.my_edit_btn.clicked.connect(self.button_B_pressed)
    self.mytable.setCellWidget(1, 0, self.my_edit_btn)

    self.verticalLayout.addWidget(self.mytable)
    MainWindow.setCentralWidget(self.centralwidget)

什么是horizo​​ntalHeaderItem?

enter image description here

QTableWidgetItem是一个类,它允许您通过抽象QModelIndex和模型来简单地修改QTableWidget的信息。也就是说,它是一个允许我们在不知道模型是什么的情况下与模型交互的层,这也是QTableWidget的想法。

但是QTableWidget.horizo​​ntalHeaderItem的实际目的是什么?

在标题的情况下,它还包含信息,例如,如果我们想要建立字体,一些文本等。因此,QTableWidgetItem也与它相关联,它与内部模型的方法headerData()和setHeaderData()交互。 。总而言之,setHorizo​​ntalHeaderItem方法允许建立一个QTableWidgetItem,它将具有与水平头相关联的信息。

from PyQt5 import QtCore, QtGui, QtWidgets

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QTableWidget(10, 10)
    header_item = QtWidgets.QTableWidgetItem("Foo")
    font = QtGui.QFont("arial", 20)
    font.setBold(True)
    font.setItalic(True)
    header_item.setFont(font)
    w.setHorizontalHeaderItem(1, header_item)
    w.show()
    sys.exit(app.exec_())

enter image description here

为什么我会使用它而不是QTableWidget.item?正如我向您指出的那样,使用horizo​​ntalHeaderItem不是您的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.