PyQt5 Qtablewidget 并连接到按钮 [英] PyQt5 Qtablewidget and connecting to buttons
问题描述
我创建了一个 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._addrow
和 table._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屋!