什么是 horizontalHeaderItem
what is horizontalHeaderItem
我正在按照一些示例构建带有单元格内按钮的 QTableWidget,有人建议使用 QTableWidget.horizontalHeaderItem。现在,这很好用,但是我无法从特定的 row/column 取回项目(因为 QTableWidget.horizontalHeaderItem 没有指定的行)。
但是 QTableWidget.horizontalHeaderItem 的实际用途是什么,为什么我要用它而不是 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_())
最后我想根据特定的 row/column 值手动创建 QModelIndex。我找到了 'indexFromItem' 方法,但在使用 QTableWidget.horizontalHeaderItem.
时我无法获取特定项目
如果删除逻辑中使用 horizontalHeaderItem() 和 setHorizontalHeaderItem() 的部分,您的代码将继续工作,因此使用这些元素永远无法解决您的问题。要验证这一点,请将 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)
什么是 horizontalHeaderItem?
QTableWidgetItem 是一个class,它允许您通过抽象 QModelIndex 和模型以简单的方式修改 QTableWidget 的信息。也就是说,它是一个层,可以让我们在不知道模型是什么的情况下与模型进行交互,这也是QTableWidget的思想。
但是 QTableWidget.horizontalHeaderItem 的实际目的是什么?
在 header 的情况下,它还包含信息,例如,如果我们想要建立字体、一些文本等。因此,QTableWidgetItem 也与其关联,与方法交互 header内部模型的Data()和setHeaderData()。所以总而言之,setHorizontalHeaderItem 方法允许建立一个 QTableWidgetItem,它将具有与水平 header.
关联的信息
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? 正如我向您指出的那样,使用 horizontalHeaderItem 不是您的解决方案。
我正在按照一些示例构建带有单元格内按钮的 QTableWidget,有人建议使用 QTableWidget.horizontalHeaderItem。现在,这很好用,但是我无法从特定的 row/column 取回项目(因为 QTableWidget.horizontalHeaderItem 没有指定的行)。
但是 QTableWidget.horizontalHeaderItem 的实际用途是什么,为什么我要用它而不是 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_())
最后我想根据特定的 row/column 值手动创建 QModelIndex。我找到了 'indexFromItem' 方法,但在使用 QTableWidget.horizontalHeaderItem.
时我无法获取特定项目如果删除逻辑中使用 horizontalHeaderItem() 和 setHorizontalHeaderItem() 的部分,您的代码将继续工作,因此使用这些元素永远无法解决您的问题。要验证这一点,请将 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)
什么是 horizontalHeaderItem?
QTableWidgetItem 是一个class,它允许您通过抽象 QModelIndex 和模型以简单的方式修改 QTableWidget 的信息。也就是说,它是一个层,可以让我们在不知道模型是什么的情况下与模型进行交互,这也是QTableWidget的思想。
但是 QTableWidget.horizontalHeaderItem 的实际目的是什么?
在 header 的情况下,它还包含信息,例如,如果我们想要建立字体、一些文本等。因此,QTableWidgetItem 也与其关联,与方法交互 header内部模型的Data()和setHeaderData()。所以总而言之,setHorizontalHeaderItem 方法允许建立一个 QTableWidgetItem,它将具有与水平 header.
关联的信息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? 正如我向您指出的那样,使用 horizontalHeaderItem 不是您的解决方案。