首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何复制一行QtableWidget并插入下面的行?

如何复制一行QtableWidget并插入下面的行?
EN

Stack Overflow用户
提问于 2019-06-26 00:43:41
回答 1查看 0关注 0票数 0

我希望有一个表格,其中每一行在QtableWidget的第一个单元格中都有一个按钮,按下该按钮,整行将与前一行的所有条目(包括按钮和组合框)重复。

我试图复制它们的文本并且它成功但它没有达到目的,因为它再次需要手动将它分配给组合框等。下面的尝试,只需在每次单击时插入一个空行。该行如何与其元素完全重复?

尝试

代码语言:javascript
复制
from PyQt5 import QtCore, QtGui, QtWidgets


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.m_tablewidget = QtWidgets.QTableWidget(0, 3)
        self.m_tablewidget.setHorizontalHeaderLabels(
            ["Col 1", "Col 2", "Col 3"]
        )
        self.m_button = QtWidgets.QPushButton("Add Row", clicked=self.onClicked)

        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)
        lay = QtWidgets.QVBoxLayout(central_widget)
        lay.addWidget(self.m_tablewidget)
        lay.addWidget(self.m_button, alignment=QtCore.Qt.AlignLeft)

    def table_selector(self, tableName):
        variableSelected = []
        for r in range(tableName.rowCount()):
            row_variables = []
            for c in range(tableName.columnCount()):
                widget = tableName.cellWidget(r, c)
                if isinstance(widget, QtWidgets.QComboBox):
                    current_value = widget.currentText()
                    row_variables.append(current_value)
            variableSelected.append(row_variables)
        return variableSelected

    @QtCore.pyqtSlot()
    def addRow(self):

        rc = self.m_tablewidget.rowCount()
        self.m_tablewidget.insertRow(rc)

    @QtCore.pyqtSlot()
    def onClicked(self):
        d = {
            "a": ["x", "y", "z"],
            "b": ["4", "5", "6"],
            "c": ["21", "22", "23"],
        }

        combobox = QtWidgets.QComboBox()
        for k, v in d.items():
            combobox.addItem(k, v)

        item = QtWidgets.QTableWidgetItem()



        copyROw_button = QtWidgets.QPushButton("ADD ROW", clicked=self.addRow)

        rc = self.m_tablewidget.rowCount()
        self.m_tablewidget.insertRow(rc)

        for i, combo in enumerate((copyROw_button, combobox)):
            self.m_tablewidget.setCellWidget(rc, i, combo)




if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    w = MainWindow()
    w.resize(640, 480)
    w.show()

    sys.exit(app.exec_())
EN

回答 1

Stack Overflow用户

发布于 2019-06-26 10:43:36

在您的情况下,复制行涉及复制小部件。根据我的经验,我得出结论,你不能复制一个小部件(Qt也不允许它),因此你必须复制一个小部件的更多相关功能 (1),而不是复制一个小部件。

第一件事就是确定使一行与另一行不同的特征,在我确定的情况下:

  • QComboBox显示的数据
  • QComboBox的选定索引。
  • 第三列的文字

您的逻辑的其他元素不会更改(例如,您的应用程序不允许修改按钮的文本)。

由于我们确定了区分行的功能,因此这些参数必须是创建行的函数所采用的参数。

(1)这一点是主观的

考虑到上述情况,解决方案如下:

代码语言:javascript
复制
from PyQt5 import QtCore, QtGui, QtWidgets


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.m_tablewidget = QtWidgets.QTableWidget(0, 3)
        self.m_tablewidget.setHorizontalHeaderLabels(
            ["Col 1", "Col 2", "Col 3"]
        )
        self.m_button = QtWidgets.QPushButton("Add Row", clicked=self.onClicked)

        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)
        lay = QtWidgets.QVBoxLayout(central_widget)
        lay.addWidget(self.m_tablewidget)
        lay.addWidget(self.m_button, alignment=QtCore.Qt.AlignLeft)

    @QtCore.pyqtSlot()
    def addRow(self):
        button = self.sender()
        if not isinstance(button, QtWidgets.QPushButton):
            return
        p = button.mapTo(self.m_tablewidget.viewport(), QtCore.QPoint())
        ix = self.m_tablewidget.indexAt(p)
        if not ix.isValid() or ix.column() != 0:
            return
        r = ix.row()
        ix_combobox = 0
        text = ""
        combo = self.m_tablewidget.cellWidget(r, 1)
        if isinstance(combo, QtWidgets.QComboBox):
            ix_combobox = combo.currentIndex()
        item = self.m_tablewidget.item(r, 2)
        if item is not None:
            text = item.text()
        self.insert_row(row=r + 1, ix_combobox=ix_combobox, text=text)

    @QtCore.pyqtSlot()
    def onClicked(self):
        self.insert_row()

    def insert_row(self, d=None, ix_combobox=0, text="", row=-1):
        if d is None:
            d = {
                "a": ["x", "y", "z"],
                "b": ["4", "5", "6"],
                "c": ["21", "22", "23"],
            }
        combobox = QtWidgets.QComboBox()
        for k, v in d.items():
            combobox.addItem(k, v)
        combobox.setCurrentIndex(ix_combobox)
        item = QtWidgets.QTableWidgetItem()
        copyROw_button = QtWidgets.QPushButton("ADD ROW", clicked=self.addRow)
        if row == -1:
            row = self.m_tablewidget.rowCount()
        self.m_tablewidget.insertRow(row)
        for i, combo in enumerate((copyROw_button, combobox)):
            self.m_tablewidget.setCellWidget(row, i, combo)
        if text:
            self.m_tablewidget.setItem(row, 2, QtWidgets.QTableWidgetItem(text))


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    w = MainWindow()
    w.resize(640, 480)
    w.show()

    sys.exit(app.exec_())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档