Как закодить динамическое(по кнопке) изменение свойств таблицы в 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_())

21 Авг 2019 в 06:58
322 +1
0
Ответы
1

Исправленный и дополненный код:

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 и отображение окна при запуске.

20 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир