Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何复制一行QtableWidget并插入到它下面的行中?_Python_Pyqt_Pyqt5 - Fatal编程技术网

Python 如何复制一行QtableWidget并插入到它下面的行中?

Python 如何复制一行QtableWidget并插入到它下面的行中?,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我希望有一个表,其中每一行在QtableWidget的第一个单元格中都有一个按钮,按下该按钮,整个行将与前一行的所有条目(包括按钮和组合框)进行复制 我试着复制它们的文本,结果成功了,但没有达到目的,因为再次需要手动将其分配给组合框等。 在下面的尝试中,只需在每次单击时插入一个空行。行如何与其元素完全复制 尝试 from PyQt5 import QtCore, QtGui, QtWidgets class MainWindow(QtWidgets.QMainWindow): def

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

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

尝试

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

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

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

  • QComboBox显示的数据
  • QComboBox的选定索引
  • 第三栏的案文
逻辑中的其他元素不会更改(例如,应用程序不允许修改按钮的文本)

因为我们识别了区分行的特征,所以这些参数必须是创建行的函数所采用的参数

(1) 这一点是主观的

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

从PyQt5导入QtCore、QtGui、qtwidget
类MainWindow(QtWidgets.QMainWindow):
def uuu init uuu(self,parent=None):
超级(主窗口,自我)。\uuuuu初始化\uuuuuuu(父级)
self.m_tablewidget=qtwidts.QTableWidget(0,3)
self.m_tablewidget.setHorizontalHeaderLabels(
[“第1列”、“第2列”、“第3列”]
)
self.m_button=qtwidts.QPushButton(“添加行”,单击=self.onClicked)
central_widget=qtwidts.QWidget()
self.setCentralWidget(中心窗口小部件)
lay=qtwidts.QVBoxLayout(中心小部件)
lay.addWidget(self.m_tablewidget)
lay.addWidget(self.m_按钮,alignment=QtCore.Qt.AlignLeft)
@QtCore.pyqtSlot()
def addRow(自身):
button=self.sender()
如果不存在(按钮,QtWidgets.QPushButton):
返回
p=button.mapTo(self.m_tablewidget.viewport(),QtCore.QPoint())
ix=self.m_tablewidget.indexAt(p)
如果不是ix.isValid()或ix.column()!=0:
返回
r=第九行()
ix_组合框=0
text=“”
combo=self.m_tablewidget.cellWidget(r,1)
如果isinstance(组合,QtWidgets.QComboBox):
ix_combobox=combo.currentIndex()
item=self.m_tablewidget.item(r,2)
如果项目不是无:
text=item.text()
self.insert_行(行=r+1,ix_组合框=ix_组合框,文本=text)
@QtCore.pyqtSlot()
def onClicked(自):
self.insert_行()
def insert_行(self,d=None,ix_组合框=0,text=,行=-1):
如果d为无:
d={
“a”:[“x”、“y”、“z”],
“b”:[“4”、“5”、“6”],
“c”:[“21”、“22”、“23”],
}
combobox=qtwidts.QComboBox()
对于d.项()中的k,v:
组合框.附加项(k,v)
combobox.setCurrentIndex(ix_combobox)
item=QtWidgets.QTableWidgetItem()
copyROw_button=QtWidgets.QPushButton(“添加行”,单击=self.addRow)
如果行==-1:
row=self.m_tablewidget.rowCount()
self.m_tablewidget.insertRow(行)
对于i,枚举中的组合((copyROw_按钮,组合框)):
self.m_tablewidget.setCellWidget(行、i、组合)
如果文本:
self.m_tablewidget.setItem(第2行,QtWidgets.QTableWidgetItem(文本))
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=主窗口()
w、 调整大小(640480)
w、 show()
sys.exit(app.exec_())

在您的回复中,如果第三列有文本,如何将其也包括在克隆中?