我在表格中创建多个标签和删除按钮时遇到问题。此按钮应删除当前表中的行。我的问题是,如果我创建了多个新选项卡,它只删除最后创建的表中的行。由于我不知道我需要多少个标签,因此无法对表格进行命名。
import sys
from PyQt4 import QtGui, QtCore
class Fenster(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.resize(300, 300)
addButton = QtGui.QPushButton(u"Add Tab")
self.connect(addButton, QtCore.SIGNAL("clicked()"), self.addTab)
layout = QtGui.QVBoxLayout()
layout.addWidget(addButton)
self.tab_widget = QtGui.QTabWidget()
self.tab_widget.updatesEnabled()
widget = QtGui.QWidget()
self.tab_widget.addTab(widget, "Tab 1")
widget.setLayout(layout)
self.setCentralWidget(self.tab_widget)
self.show()
def addTab(self):
contents = QtGui.QWidget()
delButton = QtGui.QPushButton(u"Del Row")
self.connect(delButton, QtCore.SIGNAL("clicked()"), self.delRow)
self.table = QtGui.QTableWidget(5, 2)
layout = QtGui.QVBoxLayout()
layout.addWidget(self.table)
layout.addWidget(delButton)
self.tab_widget.addTab(contents, "New Tab")
contents.setLayout(layout)
def delRow(self):
self.table.setRowCount(0)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
window = Fenster()
window.show()
sys.exit(app.exec_())
答案 0 :(得分:1)
问题是self.table
始终指向您创建的最后一个表小部件。 delRow
方法需要知道要删除哪个表,因此需要引用该表。我会建议以下代码。在这里,您的插槽采用指向要从中删除的表的参数。
def addTab(self):
contents = QtGui.QWidget()
table = QtGui.QTableWidget(5, 2)
delButton = QtGui.QPushButton(u"Del Row")
delButton.clicked.connect(lambda: self.delRow(table))
layout = QtGui.QVBoxLayout()
layout.addWidget(table)
layout.addWidget(delButton)
self.tab_widget.addTab(contents, "New Tab")
contents.setLayout(layout)
def delRow(self, table):
table.setRowCount(0)
关于此代码的一些事项:
我使用了新式信号/插槽方法将点击的信号连接到插槽(它更加pythonic)
由于信号需要连接到一个包含无参数的插槽,因此我使用delRow(table)
包裹了您的lambda
方法。如果您之前没有遇到过lambda
,那么基本上是编写单行函数的简写。您可以在Python文档中阅读相关内容。
答案 1 :(得分:0)
您可以通过currentChanged()信号跟踪哪个标签处于活动状态。然后在信号处理程序中设置self.table。