2014-01-29 4 views
1

테이블에 여러 개의 탭을 만들고 삭제 버튼에 문제가 있습니다. 이 버튼은 현재 테이블의 행을 삭제해야합니다. 내 문제는 그것이 하나 이상의 새 탭을 만드는 경우에만 마지막으로 만든 테이블의 행을 삭제한다는 것입니다. 그리고 내가 얼마나 많은 탭이 필요한지 모르겠다는 이유로 테이블의 이름을 지을 수는 없습니다.오른쪽 버튼을 오른쪽에 연결 표

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

답변

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) 

이 코드에 대한 몇 가지 : 나는 슬롯에 클릭 신호를 연결하는 새로운 스타일 신호/슬롯 방식을 사용했습니다

  • (그것은 더 파이썬입니다)
  • 신호가 이 아닌 슬롯 (예 : 인수)에 연결될 것으로 예상되므로 을 사용하여 delRow(table) 메서드를 래핑했습니다. 이전에 lambda을 만나지 않았다면 기본적으로 한 줄짜리 기능을 작성하기위한 짧은 손이었습니다. 당신은 파이썬 문서에서 그것에 대해 읽을 수 있습니다.

0

currentChanged() 신호를 통해 활성화 된 탭을 추적 할 수 있습니다. 그런 다음 시그널 핸들러에서 self.table을 설정합니다.