在QTableView / QTableWidgets中添加越来越多的小部件

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

我需要一个按钮,它将添加带有一些小部件的新行。每次单击按钮-每次新行都附加新的小部件。在GridLayout中,我只能使用.addWidget(customRow,customColumn)。但是在QTableView和QTableWidget中没有这样的方法,只有.setItem(row,column)。如果我只是更改行和列,它将处于该位置,但将从过去的位置消失。我有一些示例代码(可在互联网上找到)

class MainWindow(QMainWindow):
# Переопределяем конструктор класса
def __init__(self):
    # Обязательно нужно вызвать метод супер класса
    QMainWindow.__init__(self)
    self.setMinimumSize(QSize(480, 80))             # Устанавливаем размеры
    self.setWindowTitle("Работа с QTableWidget")    # Устанавливаем заголовок окна
    central_widget = QWidget(self)                  # Создаём центральный виджет
    self.setCentralWidget(central_widget)           # Устанавливаем центральный виджет

    grid_layout = QGridLayout()             # Создаём QGridLayout
    central_widget.setLayout(grid_layout)   # Устанавливаем данное размещение в центральный виджет

    table = QTableWidget(self)  # Создаём таблицу
    table.setColumnCount(3)     # Устанавливаем три колонки
    table.setRowCount(1)        # и одну строку в таблице

    # Устанавливаем заголовки таблицы
    table.setHorizontalHeaderLabels(["Header 1", "Header 2", "Header 3"])

    # Устанавливаем всплывающие подсказки на заголовки
    table.horizontalHeaderItem(0).setToolTip("Column 1 ")
    table.horizontalHeaderItem(1).setToolTip("Column 2 ")
    table.horizontalHeaderItem(2).setToolTip("Column 3 ")

    # Устанавливаем выравнивание на заголовки
    table.horizontalHeaderItem(0).setTextAlignment(Qt.AlignLeft)
    table.horizontalHeaderItem(1).setTextAlignment(Qt.AlignHCenter)
    table.horizontalHeaderItem(2).setTextAlignment(Qt.AlignRight)

    # заполняем первую строку
    table.setItem(0, 0, QTableWidgetItem("Text in column 1"))
    table.setItem(0, 1, QTableWidgetItem("Text in column 2"))
    table.setItem(0, 2, QTableWidgetItem("Text in column 3"))
    game = QTextEdit()

    # делаем ресайз колонок по содержимому
    table.resizeColumnsToContents()

    grid_layout.addWidget(table, 0, 0)   # Добавляем таблицу в сетку


if __name__ == "__main__":
import sys

app = QApplication(sys.argv)
mw = MainWindow()
mw.show()
sys.exit(app.exec())

有一些QTextEdit'game'。例如,我需要向所有列添加一个it小部件。怎么做?

python python-3.x pyqt pyqt5
1个回答
0
投票

建议的@musicamante可能看起来像这样:

from PyQt5.Qt import *


class MainWindow(QMainWindow):
    # Переопределяем конструктор класса
    def __init__(self):
        # Обязательно нужно вызвать метод супер класса
        QMainWindow.__init__(self)
        self.setMinimumSize(QSize(480, 80))             # Устанавливаем размеры
        self.setWindowTitle("Работа с QTableWidget")    # Устанавливаем заголовок окна
        central_widget = QWidget(self)                  # Создаём центральный виджет
        self.setCentralWidget(central_widget)           # Устанавливаем центральный виджет

        grid_layout = QGridLayout()             # Создаём QGridLayout
        central_widget.setLayout(grid_layout)   # Устанавливаем данное размещение в центральный виджет

        self.table = QTableWidget(self)  # Создаём таблицу
        self.table.setColumnCount(3)     # Устанавливаем три колонки
        self.table.setRowCount(1)        # и одну строку в таблице

        # Устанавливаем заголовки таблицы
        self.table.setHorizontalHeaderLabels(["Header 1", "Header 2", "Header 3"])

        # Устанавливаем всплывающие подсказки на заголовки
        self.table.horizontalHeaderItem(0).setToolTip("Column 1 ")
        self.table.horizontalHeaderItem(1).setToolTip("Column 2 ")
        self.table.horizontalHeaderItem(2).setToolTip("Column 3 ")

        # Устанавливаем выравнивание на заголовки
        self.table.horizontalHeaderItem(0).setTextAlignment(Qt.AlignLeft)
        self.table.horizontalHeaderItem(1).setTextAlignment(Qt.AlignHCenter)
        self.table.horizontalHeaderItem(2).setTextAlignment(Qt.AlignRight)

        # заполняем первую строку
        self.table.setItem(0, 0, QTableWidgetItem("Text in column 1"))
        self.table.setItem(0, 1, QTableWidgetItem("Text in column 2"))
        self.table.setItem(0, 2, QTableWidgetItem("Text in column 3"))
        game = QTextEdit()

        # делаем ресайз колонок по содержимому
        self.table.resizeColumnsToContents()

        grid_layout.addWidget(self.table, 0, 0)   # Добавляем таблицу в сетку

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        button = QPushButton('Add')
        button.clicked.connect(self.onClicked)
        grid_layout.addWidget(button, 0, 1)

    def onClicked(self):
        rowPosition = self.table.rowCount()
        self.table.insertRow(rowPosition)
        for i in range(3):
            self.table.setCellWidget(rowPosition, i, QTextEdit())
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec())

enter image description here

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