【问题标题】:what is horizontalHeaderItem什么是horizo​​ntalHeaderItem
【发布时间】:2019-08-01 11:37:30
【问题描述】:

我按照一些示例在单元格内构建带有按钮的 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】:

    如果您删除了使用 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?

    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_())
    

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

    【讨论】:

      猜你喜欢
      • 2011-07-31
      • 2012-10-12
      • 2011-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多