что такое горизонтальный заголовок - PullRequest
2 голосов
/ 11 марта 2019

Я следовал некоторым примерам для создания QTableWidget с кнопками внутри ячеек, и было предложено использовать QTableWidget.horizontHeaderItem. Теперь это прекрасно работает, но с этим я не могу получить элемент обратно из определенной строки / столбца (так как QTableWidget.horizontHeaderItem не имеет указанной строки).

Но какова реальная цель QTableWidget.horizontHeaderItem и почему я должен использовать его вместо 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.horizontHeaderItem.

1 Ответ

3 голосов
/ 11 марта 2019

Если вы удалите часть своей логики, где вы используете HorizontalHeaderItem () и setHor horizontalHeaderItem (), ваш код продолжит работать, поэтому использование этих элементов никогда не решало вашу проблему. Чтобы убедиться в этом, замените метод 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)

что такое горизонтальный заголовок элемента?

enter image description here

QTableWidgetItem - это класс, который позволяет вам простым способом изменять информацию QTableWidget, абстрагируя, что такое QModelIndex и модель. То есть это слой, который позволяет нам взаимодействовать с моделью, не зная, что это за модель, это также идея QTableWidget.

Но какова реальная цель QTableWidget.horizontHeaderItem?

В случае заголовка он также содержит информацию, например, если мы хотим установить шрифт, некоторый текст и т. Д. Поэтому с ним также связан QTableWidgetItem, который взаимодействует с методами headerData () и setHeaderData () из внутренняя модель. Итак, в заключение, метод setHor horizontalHeaderItem позволяет установить 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? Как я уже говорил, использование HorizontalHeaderItem не было вашим решением.

...