Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.58/141: Рейтинг темы: голосов - 141, средняя оценка - 4.58
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521

Pyqt. Класс QTableView

23.12.2018, 18:01. Показов 30386. Ответов 60
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

Напишите, пожалуйста, примеры использования QTableview: указание количества строк/столбцов, заголовки столбцов, заполнение значениями. Вроде надо с помощью QAbstractItemModel. Гуглится в основном про QTableWidget.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.12.2018, 18:01
Ответы с готовыми решениями:

PyQt, редактируемый QTableView и автодобавление строк
Есть таблица, представляется классами myModel и myView. Не давно добавил возможность редактирования, с существующими значениями все хорошо,...

PYQT Вставить в ячейку QTableView произвольный виджет
Здравствуйте. Никак не могу понять, как вставить свой виджет отображения в ячейку QTableView. Есть назначение делегатов, но это...

Разница между PyQT 5 и PyQT 6
Добрый день, форумчане. Прошел тут курс всеми вами любимого автора, познакомился с GUI TKinter, и по вашим советам решил освоить PyQT. ...

60
964 / 719 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
12.01.2019, 11:33
Студворк — интернет-сервис помощи студентам
1. headerData() вызывается вьюхой автоматом, можете сделать в классе свои заголовки
2.beginResetModel/endResetModel - при загрузке данных в модель, у меня модель не для StandardItem. я работаю непосредственно с данныим модели, после их иэменения layoutChanged.emit() - сигнал вьюхе что данные были изменены.
3.
Цитата Сообщение от vic5710 Посмотреть сообщение
def flags(self,index):
* * * * if not index.isValid(): return Qt.ItemIsEnabled
* * * * if index.column() == 0:# разрешаем редактирование и выделение
* * * * * * return Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable
* * * * return Qt.ItemIsEnabled | Qt.ItemIsEditable
это в сообщении 25, лучше смотрите его (и найдите ошибку! )

Добавлено через 6 минут
вообще 95% работы с таблицами у меня было загрузка данных из файла - сортировка/парсинг - подсчет/графики
вы откуда данные брать собираетесь?
0
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
12.01.2019, 12:36  [ТС]
Цитата Сообщение от vic5710 Посмотреть сообщение
вы откуда данные брать собираетесь?
У меня будет кнопка для заполнения numpy массива рандомно. И кнопка для заполнения numpy массива из файла. И пользователь тоже может редактировать. Это тоже можно считать заполнением.

Цитата Сообщение от vic5710 Посмотреть сообщение
это в сообщении 25
Именно при запуске кода из сообщения 19 пользователь не может редактировать. Я ищу, где в коде из сообщения 19 запрещается редактирование пользователем. И код из сообщения 25 для меня намного сложнее, чем код из сообщения 19.

Цитата Сообщение от vic5710 Посмотреть сообщение
и найдите ошибку!
У меня при запуске меню не отображается. Может, это ошибка и надо где-то вызвать функцию contextMenuEvent. Например, в методе __init__ класса NPView. Я просто ее параметр не совсем понимаю. e. Это как-то связано с клавишей клавиатуры? Пока не хотела события клавиатуры обрабатывать.

Вообще я бы хотела, чтобы таблица заполнялась значениями из numpy массива как в функции ниже, но вместо qtablewidget и его свойств - qtableview и его свойства. И такую функцию я бы могла вызывать во всех кнопках заполнения массива
Python
1
2
3
4
5
6
 def TableUpd(self):
        self.Table.blockSignals(True)
        for i, row in enumerate(self.matrix):
            for j, val in enumerate(row):
                self.Table.setItem(i, j, QTableWidgetItem(str(val)))
        self.Table.blockSignals(False)
0
964 / 719 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
12.01.2019, 14:40
Цитата Сообщение от Simply me Посмотреть сообщение
У меня при запуске меню не отображаетс
ПКМ

Добавлено через 2 минуты
Цитата Сообщение от Simply me Посмотреть сообщение
Именно при запуске кода из сообщения 19 пользователь не может редактировать.
там модель R/O. R/W в 25 сообщении
0
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
13.01.2019, 09:16  [ТС]
Вот у меня есть 2 функции:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    def load_data(self):
        # загрузка данных в модель
        rows = len(self.data)
        cols = len(self.data[0])
        for row in range(rows):
            for col in range(cols):
                item = QStandardItem(str(self.data[row][col]))
                self.model.setItem(row, col, item)
 
    def calc(self):
        # пересчет значений 3 столбца из значений 2 столбца
        # в 4 столбце накопленные значения из 3 столбца
        for i in range(len(self.data)):
            self.data[i][2] = 100 * self.data[i][1]
            self.load_data()
            self.data[0][3] = self.data[0][2]
            for i in range(1, len(self.data)):
                self.data[i][3] = self.data[i - 1][3] + self.data[i][2]
            self.load_data()
Они вызываются при нажатии кнопок Load и Calc:
Python
1
2
self.btnLoad.clicked.connect(self.load_data)
        self.btnCalc.clicked.connect(self.calc)
Данные нормально загружаются и пересчитываются. Но если в таблице что-то поменять, то данные не попадают в модель. Функция calc все время по одним и тем же данным считает. Добавила такой код:
Python
1
self.model.itemChanged.connect(self.calc)
Чтобы когда данные редактируются, третий и четвертый столбец пересчитывались. После добавления этой строчки приложение запускается, но после нажатия на кнопку Load, пишет, Прекращена работа Python. В pycharm пишет: Process finished with exit code -1073740791 (0xC0000409). в терминале: синтаксическая ошибка в строке 1.
0
964 / 719 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
13.01.2019, 11:48
показывайте весь код, я по кускам не гадаю.
и определитесь что хотите использовать - свою модель или QStandardItem
какой объем данных планируете?
0
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
14.01.2019, 17:53  [ТС]
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import sys
# Импорт numpy
import numpy
 
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QTableView, QWidget, QGridLayout, QPushButton, QTreeView, QListView, QSpinBox
from PyQt5.QtGui import QStandardItemModel, QStandardItem
 
# Массив значений
mass = numpy.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]], int)
 
# Класс делегата
class MyDelegate(QtWidgets.QStyledItemDelegate):
    def createEditor(self, parent, options, index):
        editor=QtWidgets.QSpinBox(parent)
        editor.setFrame(False)
        editor.setMinimum(1)
        editor.setMaximum(5)
        editor.setSingleStep(1)
        return editor
    def setEditorData(self, editor, index):
        value = int(index.model().data(index, QtCore.Qt.EditRole))
        editor.setValue(value)
    def updateEditorGeometry(self, editor, options, index):
        editor.setGeometry(options.rect)
    def setModelData(self, editor, model, index):
        value = str(editor.value())
        model.setData(index, value, QtCore.Qt.EditRole)
 
class MyWin(QWidget):
    def __init__(self, data=None, parent=None):
        super().__init__()
        self.CreateMatrix()
        self.model = QStandardItemModel()  # модель
        self.model.setHorizontalHeaderLabels(['Delegate', 'x', 'y(x)', 'sum(y)', 'Red-Green'])  # заголовки модели
        self.table = QTableView()  # таблица
        self.table.setModel(self.model)
        self.data = data
        self.btnLoad = QPushButton("&Load") # кнопка загрузки данных
        self.btnCalc = QPushButton("&Calc") # кнопка расчета
        self.btnLoad.clicked.connect(self.load_data)
        self.btnCalc.clicked.connect(self.calc)
        grid = QGridLayout(self)
        grid.setContentsMargins(1, 1, 1, 1)
        grid.addWidget(self.table, 0, 0, 4, 4)
        grid.addWidget(self.btnLoad, 4, 0, 1, 1)
        grid.addWidget(self.btnCalc, 4, 1, 1, 1)
        self.table.setItemDelegateForColumn(0, MyDelegate())  # делегат в первом столбце таблицы
        self.model.itemChanged.connect(self.calc) # ЕСЛИ ЗАКОММЕНТИТЬ ЭТУ СТРОКУ, ТО НЕ ВЫЛЕТАЕТ
 
    def load_data(self):
        # загрузка данных в модель
        rows = len(self.data)
        cols = len(self.data[0])
        for row in range(rows):
            for col in range(cols):
                item = QStandardItem(str(self.data[row][col]))
                self.model.setItem(row, col, item)
 
    def calc(self):
        # пересчет значений 3 столбца из значений 2 столбца
        # в 4 столбце накопленные значения из 3 столбца
        for i in range(len(self.data)):
            self.data[i][2] = 100 * self.data[i][1]
            self.load_data()
            self.data[0][3] = self.data[0][2]
            for i in range(1, len(self.data)):
                self.data[i][3] = self.data[i - 1][3] + self.data[i][2]
            self.load_data()
 
    def CreateMatrix(self):
        # создание матрицы
        self.RowsCount = 8  # число строк
        self.ColumnsCount = 6  # число столбцов
        self.matrix = numpy.zeros((self.RowsCount, self.ColumnsCount))
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    myapp = MyWin(mass)
    myapp.setWindowTitle("Таблица и график")  # Заголовок окна
    myapp.show()
    app.exec_()

Цитата Сообщение от vic5710 Посмотреть сообщение
свою модель или QStandardItem
Не знаю, мне кажется, что писать отдельный класс для модели сложнее.
Цитата Сообщение от vic5710 Посмотреть сообщение
какой объем данных планируете?
Я думаю, максимум 10 на 10. Главное реализовать возможность менять размер матрицы.
0
Эксперт Python
 Аватар для dondublon
4663 / 2082 / 367
Регистрация: 17.03.2012
Сообщений: 10,203
Записей в блоге: 6
14.01.2019, 18:00
Цитата Сообщение от Simply me Посмотреть сообщение
Не знаю, мне кажется, что писать отдельный класс для модели сложнее.
Я уже кидал ссылку, зачем нужны модели, напомню: https://habr.com/post/171443/ .

У вас уже начинаются такие неприятные штуки, как
Цитата Сообщение от Simply me Посмотреть сообщение
# загрузка данных в модель
0
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
14.01.2019, 18:25  [ТС]
Я думала, что это что-то несложное и стандартное - записать данные в модель. У меня есть опыт работы с компонентами таблиц в Borland C++ Builder и VS. Там как-то проще. Все классы уже написаны. Присвоить значение в ячейку можно примерно так: Table1->Rows[i]->Cells[j]->Value="Значение";
0
964 / 719 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
14.01.2019, 18:49
Цитата Сообщение от Simply me Посмотреть сообщение
Там как-то проще. Все классы уже написаны
это вам в QTableWidget, с матрицей 10х10 нечего и париться с моделями
вы уже ошибки научитесь в консоли читать
Bash
1
2
3
4
5
Traceback (most recent call last):
  File "tk1.py", line 63, in calc
    for i in range(len(self.data)):
RecursionError: maximum recursion depth exceeded in comparison
Abort trap: 6
1. load_data() -> itemChanged() ->calc() -> load_data(). бесконечная рекурсия.
2. при редактировании во вьюхе вы меняете данные в модели, а в calc() вы меняете self.data
1
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
14.01.2019, 19:02  [ТС]
Цитата Сообщение от vic5710 Посмотреть сообщение
с матрицей 10х10
Это просто такое тестовое задание, чтобы освоила pycharm, pyqt, numpy.
Цитата Сообщение от vic5710 Посмотреть сообщение
QTableWidget
Не разрешили использовать QTableWidget, только QTableView.
Цитата Сообщение от vic5710 Посмотреть сообщение
вы уже ошибки научитесь в консоли читать
Если запускать в терминале (cmd.exe), почему-то пишет, что синтаксическая ошибка в 1 строке.
Цитата Сообщение от vic5710 Посмотреть сообщение
1. load_data() -> itemChanged() ->calc() -> load_data(). бесконечная рекурсия.
2. при редактировании во вьюхе вы меняете данные в модели, а в calc() вы меняете self.data
Спасибо, исправлю.
0
964 / 719 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
14.01.2019, 19:31
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    def calc(self):
        # пересчет значений 3 столбца из значений 2 столбца
        # в 4 столбце накопленные значения из 3 столбца
        rows = self.model.rowCount()
        cols = self.model.columnCount()
        if rows != len(self.data) or cols != len(self.data[0]):
            return
        arr = [[int(self.model.item(i,j).text()) for j in range(cols)] for i in range(rows)]
        for i in range(rows):
            arr[i][2] = 100* arr[i][1]
        arr[0][3] = arr[0][2]
        for i in range(1,rows):
            arr[i][3] = arr[i-1][3] + arr[i][2]
        for i in range(rows):
            for j in range(cols):
                self.model.item(i,j).setText(str(arr[i][j]))
        self.model.layoutChanged.emit()
Добавлено через 5 минут
Цитата Сообщение от Simply me Посмотреть сообщение
Не разрешили использовать QTableWidget, только QTableView.
ну тогда - сообщение 25, там вполне рабочая модель.

Не по теме:

юность мужает в борьбе
Sad but true

1
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
17.01.2019, 17:10  [ТС]
Спасибо)
0
964 / 719 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
17.01.2019, 19:23
пожалуйста.
если у вас данные чисто цифровые, ваш лисапед можно упростить
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QTableView, QWidget, QGridLayout, QPushButton
from PyQt5.QtGui import QStandardItemModel, QColor
 
class View(QWidget):
    def __init__(self, data=None, parent=None):
        super().__init__()
        self.model = QStandardItemModel()  # модель
        self.table = QTableView()  # таблица
        self.table.horizontalHeader().setStretchLastSection(True)
        self.btnLoad = QPushButton("&Load") # кнопка загрузки данных
        self.btnCalc = QPushButton("&Calc") # кнопка расчета
        self.btnLoad.clicked.connect(self.load_data)
        self.btnCalc.clicked.connect(self.calc)
        grid = QGridLayout(self)
        grid.setContentsMargins(0, 0, 0, 0)
        grid.addWidget(self.table, 0, 0, 4, 4)
        grid.addWidget(self.btnLoad, 4, 0, 1, 1)
        grid.addWidget(self.btnCalc, 4, 1, 1, 1)
        self.data = data
 
    def load_data(self):
        self.table.setModel(None) #отсоединяем модель - меньше перерисовок
        self.model.clear()
        rows = len(self.data)
        cols = len(self.data[0])
        self.model.setColumnCount(cols)
        self.model.setRowCount(rows)
        for row in range(rows):
            for col in range(cols):
                idx = self.model.index(row,col)
                self.model.setData(idx,self.data[row][col])
        self.model.setHorizontalHeaderLabels(['Delegate', 'x', 'y(x)', 'sum(y)', 'Red-Green'])
        self.table.setModel(self.model) #присоединяем модель
 
    def calc(self):
        self.table.setModel(None)
        rows = self.model.rowCount()
        cols = self.model.columnCount()
        arr = [[self.model.index(i,j).data() for j in range(cols)] for i in range(rows)]
        for i in range(rows):
            arr[i][2] = 100* arr[i][1]
        for i in range(1,rows):
            arr[i][3] = arr[i-1][3] + arr[i][2]
        for i in range(rows):
            for j in range(cols):
                idx = self.model.index(i,j)
                self.model.setData(idx,arr[i][j])
                if j == 4:
                    if arr[i][j]  > 0: 
                        self.model.setData(idx,QColor(Qt.green),Qt.BackgroundRole)
                    else: 
                        self.model.setData(idx,QColor(Qt.red),Qt.BackgroundRole)
        self.table.setModel(self.model)
 
if __name__ == "__main__":
    app = QApplication([])
    arr = [[float(i+j) for j in range(-2,3)] for i in range(-5,5)]
    w = View(arr)
    w.setWindowTitle("Таблица и график")
    w.resize(600,400)
    w.show()
    app.exec_()
1
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
19.01.2019, 13:05  [ТС]
Цитата Сообщение от vic5710 Посмотреть сообщение
load_data() -> itemChanged() ->calc() -> load_data()
Немного загрузилась. Где в ItemChanged вызывается calc вижу, где в calc вызывается load_data вижу. А где в load_data вызывается ItemChanged? Это опять что-то не явное?
0
964 / 719 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
19.01.2019, 14:25
itemChanged вызывается при любом изменении данных модели по дефолту, поэтому я его не использовал обычно
сделайте простую трассировку
Python
1
2
3
4
5
6
        self.data = data
        self.model.itemChanged.connect(self.item_changed)
        
    def item_changed(self,item):
        index = item.index()
        print(self.model.data(index))
Добавлено через 7 минут
хотя можно делать connect/disconnect
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    def load_data(self):
        try: self.model.itemChanged.disconnect()
        except: pass
        self.table.setModel(None) #отсоединяем модель - меньше перерисовок
        self.model.clear()
        rows = len(self.data)
        cols = len(self.data[0])
        self.model.setColumnCount(cols)
        self.model.setRowCount(rows)
        for row in range(rows):
            for col in range(cols):
                idx = self.model.index(row,col)
                self.model.setData(idx,self.data[row][col])
        self.model.setHorizontalHeaderLabels(['Delegate', 'x', 'y(x)', 'sum(y)', 'Red-Green'])
        self.table.setModel(self.model) #присоединяем модель
        self.model.itemChanged.connect(self.item_changed)
1
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
08.07.2019, 14:08  [ТС]
Скажите, пожалуйста, почему в коде из сообщений 53-55 ругается на строчку w=View(arr). Типа не знает имя View. View это класс QWidget.
Вот код
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QTableView, QWidget, QGridLayout, QPushButton
from PyQt5.QtGui import QStandardItemModel, QColor
class View(QWidget):
   def __init__(self, data=None, parent=None):
      super().__init__()
      self.model = QStandardItemModel()
      self.table = QTableView()
      self.table.horizontalHeader().setStretchLastSection(True)
      self.btnLoad = QPushButton("&Load")
      self.btnCalc = QPushButton("&Calc")
      self.btnLoad.clicked.connect(self.load_data)
      self.btnCalc.clicked.connect(self.calc)
      grid = QGridLayout(self)
      grid.setContentsMargins(0, 0, 0, 0)
      grid.addWidget(self.table, 0, 0, 4, 4)
      grid.addWidget(self.btnLoad, 4, 0, 1, 1)
      grid.addWidget(self.btnCalc, 4, 1, 1, 1)
      self.data = data
   def load_data(self):
      try : self.model.itemChanged.disconnect()
      except: pass
      self.table.setModel(None)
      self.model.clear()
      rows = len(self.data)
      cols = len(self.data[0])
      self.model.setColumnCount(cols)
      self.model.setRowCount(rows)
      for row in range(rows):
         for col in range(cols):
            idx = self.model.index(row,col)
               self.model.setData(idx,self.data[row][col])
      self.model.setHorizontalHeaderLabels(['Delegate', 'x', 'y(x)', 'sum(y)', 'Red-Green'])
      self.table.setModel(self.model)
      self.model.itemChanged.connect(self.item_changed)
   def calc(self):
      self.table.setModel(None)
      rows = self.model.rowCount()
      cols = self.model.columnCount()
      arr = [[self.model.index(i,j).data() for j in range(cols)] for i in range(rows)]
      for i in range(rows):
         arr[i][2] = 100* arr[i][1]
      for i in range(1,rows):
         arr[i][3] = arr[i-1][3] + arr[i][2]
      for i in range(rows):
         for j in range(cols):
            idx = self.model.index(i,j)
            self.model.setData(idx,arr[i][j])
            if j == 4:
               if arr[i][j]​ > 0:
                  self.model.setData(idx,QColor(Qt.green),Qt.BackgroundRole)
               else:
                  self.model.setData(idx,QColor(Qt.red),Qt.BackgroundRole)
      self.table.setModel(self.model)
   if __name__ == "__main__":
      app = QApplication([])
      arr = [[float(i+j) for j in range(-2,3)] for i in range(-5,5)]
      w = View(arr)
      w.setWindowTitle("Таблица и график")
      w.resize(600,400)
      w.show()
      app.exec_()
Блин, опять что-то со шрифтом ( может, модератор поправит
0
964 / 719 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
08.07.2019, 14:37
ну если у вас копипаст из сообщ. 53 то УМВР
0
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
09.07.2019, 10:00  [ТС]
Мне всё-таки нужна abstractmodel, а не standardmodel. Посмотрите, пожалуйста, почему вылетает в функции load. Как-то сложно в pycharm отлаживать. У data значение bool. Я правильно понимаю, что если создавать mywindow по умолчанию, то должен записаться пустой массив numpy, если передать массив в качестве параметра, то запишется этот массив?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from*PyQt5.QtWidgets*import(QApplication, QTableView, QPushButton, QVBoxLayout, QWidget)
from*PyQt5.QtCore*import*Qt, QAbstractTableModel, QModelIndex
import*numpy*as*np
 
mass = np.array([[1,*2,*3], [4,*5,*6], [7,*8,*9], [10,*11,*12], [13,*14,*15]],float)*# массив numpy с данными
 
# модель для работы с numpy
class*NPModel(QAbstractTableModel):
​ ​ ​*def*__init__(self, data = np.array([[]]),*parent=None):
​ ​ ​ ​ ​ ​ ​*super().__init__()
​ ​ ​ ​ ​ ​ ​*self.npdata=data*# присваивание в модель данных из массива numpy
​ ​ ​*def*rowCount(self, index=QModelIndex()):*# количество строк модели
​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​*return*len(self.npdata)
​ ​ ​*def*columnCount(self, index=QModelIndex()):*# количество столбцов модели
​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​*return*len(self.npdata[0])
​ ​ ​*def*data(self, index):
​ ​ ​ ​ ​ ​ ​ value =*self.npdata[index.row()][index.column()]
​ ​ ​ ​ ​ ​ ​*return*str(value)
​ ​ ​*def*headerData(self, section, orientation, role):
​ ​ ​ ​ ​ ​ ​*if*orientation == Qt.Vertical:
​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​*return*'Строка '*+str(section)
​ ​ ​ ​ ​ ​ ​*else:
​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​*return*'Столбец '*+str(section)
​ ​ ​*def*set(self, arr=np.array([[]])):
​ ​ ​ ​ ​ ​ ​*self.beginResetModel()
​ ​ ​ ​ ​ ​ ​*self.npdata = arr
​ ​ ​ ​ ​ ​ ​*self.endResetModel()
​ ​ ​ ​ ​ ​ ​*self.layoutChanged.emit()
# окно
class*MyWindow(QWidget):
​ ​ ​*def__init__(self,data=np.array([[]]),parent =*None):
​ ​ ​ ​ ​ ​ ​*super().__init__()
​ ​ ​ ​ ​ ​ ​*self.model = NPModel()
​ ​ ​ ​ ​ ​ ​*self.table = QTableView()
​ ​ ​ ​ ​ ​ ​*self.table.setModel(self.model)*# присваивание модели таблице
​ ​ ​ ​ ​ ​ ​*self.btnLoad = QPushButton("Load")
​ ​ ​ ​ ​ ​ ​*self.btnCalc = QPushButton("Calc")
​ ​ ​ ​ ​ ​ ​*self.btnLoad.clicked.connect(self.load)
​ ​ ​ ​ ​ ​ ​*self.btnCalc.clicked.connect(self.calc)
​ ​ ​ ​ ​ ​ ​ vbox = QVBoxLayout(self)
​ ​ ​ ​ ​ ​ ​ vbox.addWidget(self.table)
​ ​ ​ ​ ​ ​ ​ vbox.addWidget(self.btnLoad)
​ ​ ​ ​ ​ ​ ​ vbox.addWidget(self.btnCalc)
​ ​ ​ ​ ​ ​ ​*self.setLayout(vbox)
​ ​ ​ ​ ​ ​ ​*self.load(data)
​ ​ ​*def*load(self, data=np.array([[]])):
​ ​ ​ ​ ​ ​ ​*self.data = data
​ ​ ​ ​ ​ ​ ​*self.model.set(data.copy())
​ ​ ​*def*calc(self):
​ ​ ​ ​ ​ ​ ​ rows =*self.model.rowCount()
​ ​ ​ ​ ​ ​ ​ cols =*self.model.columnCount()
​ ​ ​ ​ ​ ​ ​*for*i*in*range(rows):
​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​*for*j*in*range(cols):
​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​*self.model.npdata[i][j] /= (j +*2)
​ ​ ​ ​ ​ ​ ​*self.model.layoutChanged.emit()
if*__name__ ==*"__main__":
​ ​ ​ app = QApplication([])
​ ​ ​ mw=MyWindow()
​ ​ ​ mw.setWindowTitle("Таблица и график")
​ ​ ​*# mw.load(mass)
​ ​ ​*mw.resize(800,600)
​ ​ ​ mw.show()
​ ​ ​ app.exec_()
0
964 / 719 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
09.07.2019, 11:18
покажите ошибку

Добавлено через 1 час 8 минут
вы функцию data() в модели поменяли
Python
1
2
3
4
5
    def data(self,index,role):
        if not index.isValid() or role != Qt.DisplayRole: 
            return None
        val = self.npdata[index.row()][index.column()]
        return str(round(val,4))
0
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
09.07.2019, 11:59  [ТС]
Вернула. Все равно вылетает. Это не ошибка. Компилируется. Но если нажать на кнопку Load, пишет, прекращена работа python.
Я еще не все строчки понимаю. Что происходит в 45 строке, не понимаю. Вызывается функция load класса mywindow. Если ошибка в функции load, то по идее уже при инстанцировании MyWindow должно вылететь, а не когда нажимаешь на кнопку. И функцию load не понимаю. Там data (параметр функции load) копируется в data (свойство класса MyWindow)?

Добавлено через 4 минуты
Похоже, проблема не в функции load. До строчки app.exec_() нормально доходит. Дальше окно открывается. Там нажимаю кнопку Load. Функцию Load нормально проходит. Возвращается в строчку app.exec_() и вылетает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.07.2019, 11:59

Из QT в PyQt
Здравствуйте, подскажите правильно ли у меня получился перевод из QT в PyQt? Интересует именно выполнение класса QCoreApplication и...

PyQt, Qt и ScrollArea
Доброй ночи. В этот раз кода не будет, так как клин. Из русскоязычных мануалов по PyQt только Прохоренок, которого все хаят (а...

PyQt + PyCharm
Как подключить PyQT5 к pycharm 4.5.3 ? python 3.4

PyQt и Spyder 3
Доброго времени суток! Возyикает проблема после установки PyQt - перестает запускаться Spyder 3, никаких ошибок, ничего. Запускаешь IDE,...

Paint pyqt
Добрый вечер, помогите разобраться с кодом я в Python (pyqt, Desinger) новичок. Можете обяснить по подробнее с "Class Canvas"...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru