Форум сайта python.su
from PyQt4.QtGui import * header1 = ['N', 'Тип', 'V', 'Pг', 'Pн', 'Qн'] header2 = ['Nн', 'Nк', 'R', 'X'] class MyTable(QTableWidget): def __init__(self, header, *args): QTableWidget.__init__(self, *args) self.header = header self.setHorizontalHeaderLabels(header) self.setColumnWidth(0, 40) self.setColumnWidth(1, 40) self.resizeRowsToContents() class MainWidget(QWidget): def __init__(self): QWidget.__init__(self) self.setGeometry(250, 150, 400, 300) self.setWindowTitle("Ньютон") tab_widget = QTabWidget() tab1 = QWidget() tab2 = QWidget() tab3 = QWidget() tab_widget.addTab(tab1, "Узлы") tab_widget.addTab(tab2, "Ветви") tab_widget.addTab(tab3, "Расчет") #Uzli on tab1 table1 = MyTable(header1, 3, 6, tab1) table1.resize(500, 2222) table1.show() #Vetvi on tab2 table2 = MyTable(header2, 1, 4, tab2) table2.resize(500, 2222) table2.show() #bottom del btn_del1 = QPushButton("delete row", tab1) btn_del1.clicked.connect(self.row) btn_del1.move(510, 0) #layout vbox = QVBoxLayout() vbox.addWidget(tab_widget) self.setLayout(vbox) def row(self): self.table1.removeRow(table1.selectedRows) if __name__ == "__main__": import sys app = QApplication(sys.argv) widget = MainWidget() widget.resize(640, 480) widget.show() sys.exit(app.exec_())
\Traceback (most recent call last): File "D:/tests/table.py", line 53, in row self.table1.removeRow(table1.selectedRows) AttributeError: 'MainWidget' object has no attribute 'table1'
Отредактировано heso (Янв. 18, 2014 22:31:33)
Офлайн
heso
чтобы исправить ошибку
... self.table1 = MyTable(header1, 3, 6, tab1) ... def row(self): self.table1.removeRow(self.table1.selectedRows)
table1.selectedRows
Офлайн
Спасибо большое, в итоге решил пока остановиться на этом:
btn_del1 = QPushButton("delete row", tab1) btn_del1.clicked.connect(self.delrow) ...
def delrow(self): self.table1.removeRow(self.table1.currentRow())
Отредактировано heso (Янв. 18, 2014 21:38:20)
Офлайн
hesoсам не профи и поэтому не отвечаю а спрашиваю:
Данную кнопку необходимо использовать и для второй вкладки
self.connect(self.tab_widget, SIGNAL('currentChanged(int)'), self.switchingTabs)
def switchingTabs(self, i): self.currentIndex = i
tables = {} tables[0] = MyTable(header1, 3, 6, tab1)
tables[self.currentIndex].removeRow(tables[self.currentIndex].currentRow())
Офлайн
увы, но эта кнопка должна быть лишь на 2 табах, на третьем ее не будет.
Попробовал вот так:
from PyQt4.QtGui import * from PyQt4.QtCore import * header1 = ['N', 'Тип', 'V', 'Pг', 'Pн', 'Qн'] header2 = ['Nн', 'Nк', 'R', 'X'] class MyTable(QTableWidget): def __init__(self, header, *args): QTableWidget.__init__(self, *args) self.header = header self.setHorizontalHeaderLabels(header) self.setColumnWidth(0, 40) self.setColumnWidth(1, 40) self.resizeRowsToContents() class MainWidget(QWidget): def __init__(self): QWidget.__init__(self) self.setGeometry(250, 150, 400, 300) self.setWindowTitle("Ньютон") self.tab_widget = QTabWidget() self.tab1 = QWidget() self.tab2 = QWidget() self.tab3 = QWidget() self.tab_widget.addTab(self.tab1, "Узлы") self.tab_widget.addTab(self.tab2, "Ветви") self.tab_widget.addTab(self.tab3, "Расчет") #Uzli on tab1 self.table = {} self.table[1] = MyTable(header1, 3, 6, self.tab1) self.table[1].resize(500, 2222) self.table[1].show() #Vetvi on tab2 self.table[2] = MyTable(header2, 1, 4, self.tab2) self.table[2].resize(500, 2222) self.table[2].show() #bottom del1 btn1_del1 = QPushButton("delete row", self.tab1) btn1_del1.clicked.connect(self.delrow) btn1_del1.move(510, 0) #bottom del2 btn2_del1 = QPushButton("delete row", self.tab2) btn2_del1.clicked.connect(self.delrow) btn2_del1.move(510, 0) #layout vbox = QVBoxLayout() vbox.addWidget(self.tab_widget) self.setLayout(vbox) def delrow(self): self.connect(self.tab_widget, SIGNAL('currentChanged(int)'), self.switchingTabs) self.table[self.currentIndex].removeRow(self.table[self.currentIndex].currentRow()) def switchingTabs(self, i): self.currentIndex = i if __name__ == "__main__": import sys app = QApplication(sys.argv) widget = MainWidget() widget.resize(640, 480) widget.show() sys.exit(app.exec_())
Traceback (most recent call last): File "D:/tests/table.py", line 68, in delrow self.table[self.currentIndex].removeRow(self.table[self.currentIndex].currentRow()) AttributeError: 'MainWidget' object has no attribute 'currentIndex'
def switchingTabs(self, i):
Отредактировано heso (Янв. 19, 2014 15:37:56)
Офлайн
А ларчик то ведь просто открывался….
def delrow(self): self.table[self.tab_widget.currentIndex()].removeRow(self.table[self.tab_widget.currentIndex()].currentRow())
Офлайн
hesoне знаю я бы всё равно бы сделал одну кнопку вне таба а при переключении табов
увы, но эта кнопка должна быть лишь на 2 табах, на третьем ее не будет.
removeRow(self.table[self.tab_widget.currentIndex()].currentRow())
Отредактировано vrabey (Янв. 19, 2014 16:27:23)
Офлайн
Индекс выделенной строки находится с помощью .currentRow().
.currentIndex() отображает индекс таба(начиная с нуля)
Насчет кнопки- действительно, стОит подумать над предложением, пока что получилось нечто такое:
from PyQt4.QtGui import * header1 = ['N', 'Тип', 'V', 'Pг', 'Pн', 'Qн'] header2 = ['Nн', 'Nк', 'R', 'X'] class MyTable(QTableWidget): def __init__(self, header, *args): QTableWidget.__init__(self, *args) self.header = header self.setHorizontalHeaderLabels(header) self.setColumnWidth(0, 40) self.setColumnWidth(1, 40) self.resizeRowsToContents() self.verticalScrollBar() class MainWidget(QWidget): def __init__(self): QWidget.__init__(self) self.setGeometry(250, 150, 400, 300) self.setWindowTitle("Ньютон") self.tab_widget = QTabWidget() self.tab1 = QWidget() self.tab2 = QWidget() self.tab3 = QWidget() self.tab_widget.addTab(self.tab1, "Узлы") self.tab_widget.addTab(self.tab2, "Ветви") self.tab_widget.addTab(self.tab3, "Расчет") #Uzli on tab1 self.table = {} self.table[0] = MyTable(header1, 1, 6, self.tab1) self.table[0].resize(525, 430) self.table[0].show() #Vetvi on tab2 self.table[1] = MyTable(header2, 1, 4, self.tab2) self.table[1].resize(525, 430) self.table[1].show() #bottom del1 btn1_del = QPushButton("delete row", self.tab1) btn1_del.clicked.connect(self.delrow) btn1_del.move(530, 30) #bottom del2 btn2_del = QPushButton("delete row", self.tab2) btn2_del.clicked.connect(self.delrow) btn2_del.move(530, 30) #bottom add1 btn1_add = QPushButton("add row", self.tab1) btn1_add.clicked.connect(self.addrow) btn1_add.move(530, 0) #bottom add2 btn2_add = QPushButton("add row", self.tab2) btn2_add.clicked.connect(self.addrow) btn2_add.move(530, 0) #layout vbox = QVBoxLayout() vbox.addWidget(self.tab_widget) self.setLayout(vbox) def delrow(self): self.table[self.tab_widget.currentIndex()].removeRow(self.table[self.tab_widget.currentIndex()].currentRow()) def addrow(self): self.table[self.tab_widget.currentIndex()].insertRow(self.table[self.tab_widget.currentIndex()].rowCount()) self.table[self.tab_widget.currentIndex()].resizeRowsToContents() if __name__ == "__main__": import sys app = QApplication(sys.argv) widget = MainWidget() widget.resize(640, 480) widget.show() sys.exit(app.exec_())
Отредактировано heso (Янв. 19, 2014 16:42:31)
Офлайн