Как закодить динамическое(по кнопке) изменение свойств таблицы в PyQT5? Дано: 2 QLineEdit'а и 1 кнопка. Необходимо: 1) Необходимо по нажатию кнопки считать данные из QLineEdit'ов, привести их к типу int(потому что подозреваю, что считаются они в str) и запихнуть в команды table.setRowCount() и table.setColumnCount(). То есть изменить вид таблицы, основываясь на введённых данных. Желательно: 2) Пояснять нерадивому автору заметки информацию о создании "кривых" таблиц. То есть в первом столбце такой таблицы будет, например, 5 строк. Во втором столбце каждой из строк первого столбца будут соответствовать ещё некоторое количество строк (т.е. первой строке первого столбца будет одно поле, а в первой строке второго столбца их будет 5 или 3). Примерно так же по отношению к 3-му столбцу относительно 2-го столбца. То есть, если идти в обратном порядке и проводить параллель с Excel - это объединение нескольких ячеек в одну. В коде предпринималась попытка создать(НЕ показать) таблицу по нажатию на клавишу (что, я так понимаю, или очень сложно или почти невозможно), поэтому не обращайте пожалуйста на это внимания.Под катом код.#!/usr/bin/python3 # -*- coding: utf-8 -*- import sys from PyQt5.QtWidgets import QLabel, QWidget, QMessageBox, QApplication, QToolTip, QPushButton, QHBoxLayout, QVBoxLayout, QLineEdit, QDesktopWidget, QTableWidget from PyQt5.QtGui import QIcon, QFont from PyQt5.QtCore import pyqtSlot class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): # задаём параметры окна, имя, иконку в корне self.resize(730, 486) self.setWindowTitle('Message box') self.setWindowIcon(QIcon('icon.png')) # определяем лейблы с расположением и размерами l1 = QLabel('Количество экспертов', self) l1.setGeometry(10, 0, 121, 21) l2 = QLabel('Количество кандидатов', self) l2.setGeometry(10, 60, 131, 16) # определяем textbox'ы с расположением и размерами txb1 = QLineEdit(self) txb1.setGeometry(10, 30, 113, 20) txb2 = QLineEdit(self) txb2.setGeometry(10, 80, 113, 20) # определяем кнопку, её подсказку, размер и прочее btn1 = QPushButton('Сфомировать таблицу', self) btn1.setToolTip('This is a QPushButton widget') btn1.setGeometry(140, 80, 131, 23) #определяем ещё не видную таблицу t1 = QTableWidget(self) btn1.clicked.connect(self.on_click) self.show() # происходит троллинг (нажатие клавиши) @pyqtSlot() def on_click(self): txbVal1 = self.txb1.text() txbVal2 = self.txb2.text() t1.setRowCount(self, txbVal1) t1.setColumnCount(self, txbVal2) t1.SetGeomety(10, 130) self.t1.show() def closeEvent(self, event): reply = QMessageBox.question(self, 'Message', "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
import sys from PyQt5.QtWidgets import QLabel, QWidget, QMessageBox, QApplication, QPushButton, QLineEdit, QTableWidget, QTableWidgetItem, QVBoxLayout, QHBoxLayout class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.resize(730, 486) self.setWindowTitle('Message box') l1 = QLabel('Количество экспертов', self) l2 = QLabel('Количество кандидатов', self) txb1 = QLineEdit() txb2 = QLineEdit() btn1 = QPushButton('Сформировать таблицу', self) btn1.clicked.connect(self.on_click) v_layout = QVBoxLayout() v_layout.addWidget(l1) v_layout.addWidget(txb1) v_layout.addWidget(l2) v_layout.addWidget(txb2) v_layout.addWidget(btn1) self.setLayout(v_layout) self.table = QTableWidget(self) def on_click(self): txbVal1 = int(self.layout().itemAt(1).widget().text()) txbVal2 = int(self.layout().itemAt(3).widget().text()) self.table.setRowCount(txbVal1) self.table.setColumnCount(txbVal2) for i in range(txbVal1): for j in range(txbVal2): item = QTableWidgetItem(f'Row {i+1}, Col {j+1}') self.table.setItem(i, j, item) self.table.setGeometry(10, 130, 500, 300) self.table.show() def closeEvent(self, event): reply = QMessageBox.question(self, 'Message', "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() ex.show() sys.exit(app.exec_())
1) Используется один объект table вместо t1 для таблицы. 2) Исправлены ошибки с получением и использованием данных из QLineEdit. 3) Создана таблица на основе введенных данных с присвоением текста в ячейки. 4) Исправлены ошибки с вызовом методов setRowCount(), setColumnCount(), setGeometry() и show() для таблицы. 5) Название переменной для таблицы изменено с t1 на self.table. 6) Подправлен код размещения виджетов на форме на вертикальный layout и отображение окна при запуске.
Исправленный и дополненный код:
import sysfrom PyQt5.QtWidgets import QLabel, QWidget, QMessageBox, QApplication, QPushButton, QLineEdit, QTableWidget, QTableWidgetItem, QVBoxLayout, QHBoxLayout
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.resize(730, 486)
self.setWindowTitle('Message box')
l1 = QLabel('Количество экспертов', self)
l2 = QLabel('Количество кандидатов', self)
txb1 = QLineEdit()
txb2 = QLineEdit()
btn1 = QPushButton('Сформировать таблицу', self)
btn1.clicked.connect(self.on_click)
v_layout = QVBoxLayout()
v_layout.addWidget(l1)
v_layout.addWidget(txb1)
v_layout.addWidget(l2)
v_layout.addWidget(txb2)
v_layout.addWidget(btn1)
self.setLayout(v_layout)
self.table = QTableWidget(self)
def on_click(self):
txbVal1 = int(self.layout().itemAt(1).widget().text())
txbVal2 = int(self.layout().itemAt(3).widget().text())
self.table.setRowCount(txbVal1)
self.table.setColumnCount(txbVal2)
for i in range(txbVal1):
for j in range(txbVal2):
item = QTableWidgetItem(f'Row {i+1}, Col {j+1}')
self.table.setItem(i, j, item)
self.table.setGeometry(10, 130, 500, 300)
self.table.show()
def closeEvent(self, event):
reply = QMessageBox.question(self, 'Message', "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())
1) Используется один объект table вместо t1 для таблицы.
2) Исправлены ошибки с получением и использованием данных из QLineEdit.
3) Создана таблица на основе введенных данных с присвоением текста в ячейки.
4) Исправлены ошибки с вызовом методов setRowCount(), setColumnCount(), setGeometry() и show() для таблицы.
5) Название переменной для таблицы изменено с t1 на self.table.
6) Подправлен код размещения виджетов на форме на вертикальный layout и отображение окна при запуске.