将右按钮与右表连接

时间:2014-01-29 10:17:55

标签: python qt pyqt pyqt4 slot

我在表格中创建多个标签和删除按钮时遇到问题。此按钮应删除当前表中的行。我的问题是,如果我创建了多个新选项卡,它只删除最后创建的表中的行。由于我不知道我需要多少个标签,因此无法对表格进行命名。

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

2 个答案:

答案 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。