PyQt5 Qtablewidget 并连接到按钮 [英] PyQt5 Qtablewidget and connecting to buttons

查看:110
本文介绍了PyQt5 Qtablewidget 并连接到按钮的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个 Qtablewidget 作为一个类,add_button 添加行,delete_button 从表中向上删除行.我想将功能连接到按钮,但它无法正常工作.我已经用getattr方法调用过这个函数,还是不行.

I have created a Qtablewidget as a class, and add_button to add rows, a delete_button to remove rows from table down upwards. I would like to connect functions to buttons, but it doesn't work correctly. I have used getattr method to call the function, still does not work.

桌子

解释更多,这些脚本行给出了属性错误.当它们被 button.clicked.connect 方法调用时.

to explain more, those scriptlines are giving attributte errors. when they are called by button.clicked.connect method.

add_button.clicked.connect(self._addrow)
delete_button.clicked.connect(self._removeItem)

脚本如下:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets, Qt


class loadtable(QtWidgets.QTableWidget):
    def __init__(self, parent=None):
        super(loadtable, self).__init__(parent)

        self.setColumnCount(5)
        self.setRowCount(1)
        self.setFont(QtGui.QFont("Helvetica", 10, QtGui.QFont.Normal, italic=False))   
        headertitle = ("A","B","C","D","E")
        self.setHorizontalHeaderLabels(headertitle)
        self.verticalHeader().setVisible(False)
        self.horizontalHeader().setHighlightSections(False)
        self.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Fixed)
        self.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection)
        self.setColumnWidth(0, 130)
        combox_lay = QtWidgets.QComboBox(self)
        combox_lay.addItems(["I","II"])
        self.setCellWidget(0, 4, combox_lay)


        self.cellChanged.connect(self._cellclicked)
        #self.cellChanged.connect(self._addrow)
        #self.cellDoubleClicked.connect(self._removerow)

    def _cellclicked(self):
        self.value = self.currentItem()
        self.value.setTextAlignment(Qt.AlignCenter)
        #if self.value is not None:
           #return self.value.setTextAlignment(Qt.AlignCenter)        

    def _addrow(self):
        rowcount = self.rowCount()
        print(rowcount)
        self.setRowCount(rowcount+1)
        combox_add = QtWidgets.QComboBox(self)
        combox_add.addItems(["I","II"])
        self.setCellWidget(rowcount, 4, combox_add)

    def _removerow(self):
        self.removeRow(1)


class thirdtabloads(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(thirdtabloads, self).__init__(parent)      
        table = loadtable()


        button_layout = QtWidgets.QVBoxLayout()
        add_button = QtWidgets.QPushButton("Add")
        add_button.clicked.connect(self._addrow)
        delete_button = QtWidgets.QPushButton("Delete")
        delete_button.clicked.connect(self._removeItem)
        button_layout.addWidget(add_button, alignment=QtCore.Qt.AlignBottom)
        button_layout.addWidget(delete_button, alignment=QtCore.Qt.AlignTop)


        tablehbox = QtWidgets.QHBoxLayout()
        tablehbox.setContentsMargins(10,10,10,10)
        tablehbox.addWidget(table)

        grid = QtWidgets.QGridLayout(self)
        grid.addLayout(button_layout, 0, 1)
        grid.addLayout(tablehbox, 0, 0)        



if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = thirdtabloads()
    w.show()
    sys.exit(app.exec_())

推荐答案

添加一行必须使用insertRow(),删除最后一行使用removeRow() 并传递最后一行并记住编号从 0 开始,所以最后一行是 self.rowCount() - 1.

To add a row you must use insertRow(), to remove the last row use removeRow() and pass the last row and remember that the numbering starts from 0 so the last row is self.rowCount() - 1.

另一方面,你的连接不正确,我问你:谁拥有插槽_addrow()_removerow()?属于 LoadTable,因此要访问它们,我们需要该类的对象,即 table._addrowtable._removerow.

On the other hand, your connection is incorrect, I ask you: Who owns the slot _addrow() and _removerow()? belongs to LoadTable, so to access them we need an object of that class, ie table._addrow and table._removerow.

import sys
from PyQt5 import QtCore, QtGui, QtWidgets


class LoadTable(QtWidgets.QTableWidget):
    def __init__(self, parent=None):
        super(LoadTable, self).__init__(1, 5, parent)
        self.setFont(QtGui.QFont("Helvetica", 10, QtGui.QFont.Normal, italic=False))   
        headertitle = ("A","B","C","D","E")
        self.setHorizontalHeaderLabels(headertitle)
        self.verticalHeader().hide()
        self.horizontalHeader().setHighlightSections(False)
        self.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Fixed)

        self.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection)
        self.setColumnWidth(0, 130)

        combox_lay = QtWidgets.QComboBox(self)
        combox_lay.addItems(["I","II"])
        self.setCellWidget(0, 4, combox_lay)

        self.cellChanged.connect(self._cellclicked)

    @QtCore.pyqtSlot(int, int)
    def _cellclicked(self, r, c):
        it = self.item(r, c)
        it.setTextAlignment(QtCore.Qt.AlignCenter)        

    @QtCore.pyqtSlot()
    def _addrow(self):
        rowcount = self.rowCount()
        self.insertRow(rowcount)
        combox_add = QtWidgets.QComboBox(self)
        combox_add.addItems(["I","II"])
        self.setCellWidget(rowcount, 4, combox_add)

    @QtCore.pyqtSlot()
    def _removerow(self):
        if self.rowCount() > 0:
            self.removeRow(self.rowCount()-1)


class ThirdTabLoads(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(ThirdTabLoads, self).__init__(parent)    

        table = LoadTable()

        add_button = QtWidgets.QPushButton("Add")
        add_button.clicked.connect(table._addrow)

        delete_button = QtWidgets.QPushButton("Delete")
        delete_button.clicked.connect(table._removerow)

        button_layout = QtWidgets.QVBoxLayout()
        button_layout.addWidget(add_button, alignment=QtCore.Qt.AlignBottom)
        button_layout.addWidget(delete_button, alignment=QtCore.Qt.AlignTop)


        tablehbox = QtWidgets.QHBoxLayout()
        tablehbox.setContentsMargins(10, 10, 10, 10)
        tablehbox.addWidget(table)

        grid = QtWidgets.QGridLayout(self)
        grid.addLayout(button_layout, 0, 1)
        grid.addLayout(tablehbox, 0, 0)        


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = ThirdTabLoads()
    w.show()
    sys.exit(app.exec_())

这篇关于PyQt5 Qtablewidget 并连接到按钮的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆