Форум программистов, компьютерный форум, киберфорум
Python: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 20.12.2023
Сообщений: 27

Правильное оформление QTableView PyQt6

21.02.2024, 22:31. Показов 2512. Ответов 6

Студворк — интернет-сервис помощи студентам
Здравствуйте. Всем кто возьмётся мне бедалаге помочь огромный респект.
Есть QTableView:
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
from PyQt6.QtCore import Qt, QAbstractTableModel, QModelIndex
from PyQt6.QtWidgets import QApplication, QTableView
from PyQt6 import QtWidgets, QtCore, QtGui
 
 
def toFixed(numObj, digits=0):
    return f"{numObj:.{digits}f}"
 
 
class CustomTableModel(QAbstractTableModel):
    def __init__(self, data):
        super().__init__()
        self._data = data
 
    def rowCount(self, parent=QModelIndex()):
        return len(self._data)
 
    def columnCount(self, parent=QModelIndex()):
        return len(self._data[0])
 
    def data(self, index, role=Qt.ItemDataRole.DisplayRole):
        if role == Qt.ItemDataRole.DisplayRole or role == Qt.ItemDataRole.EditRole:
            return self._data[index.row()][index.column()]
 
    def flags(self, index):
        return Qt.ItemFlag(Qt.ItemFlag.ItemIsEditable | Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable)
 
    def setData(self, index, value, role=Qt.ItemDataRole.EditRole):
        if role == Qt.ItemDataRole.EditRole:
            self._data[index.row()][index.column()] = value
            self._data[index.row()][index.column() + 1] = toFixed(float(value) * 10) #toFixed чтобы убрать копейки
            self._data[index.row()][index.column() + 2] = toFixed(float(value) * 15) #toFixed чтобы убрать копейки
 
            self._data[6][index.column()] = \
                sum([float(self._data[i][index.column()]) for i in range(5)])
            self._data[6][index.column() + 1] = \
                sum([int(self._data[i][index.column() + 1]) for i in range(5)])
            self._data[6][index.column() + 2] = \
                sum([int(self._data[i][index.column() + 2]) for i in range(5)])
 
            if self._data[6][index.column()] - round(self._data[6][index.column()], 2) < 0.01: #Чтобы убрать кучу нулей
                self._data[6][index.column()] = round(self._data[6][index.column()], 2)
 
            self.layoutChanged.emit()
            self.dataChanged.emit(index, index, [role])
            return True
 
        return False
 
 
class PaddingDelegate(QtWidgets.QStyledItemDelegate):
    def __init__(self, parent=None):
        super(PaddingDelegate, self).__init__(parent)
 
    def displayText(self, text, locale):
        return f" {text} " #Отступ текста от краев
 
    def initStyleOption(self, option, index):
        super().initStyleOption(option, index)
        if index.column() != 0 and index.column() != 1:
            option.displayAlignment = Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter
 
    def createEditor(self, parent, option, index): #Всë это чтобы убрать смещение текста при редактировании
        editor = super().createEditor(parent, option, index)
        editor.setStyleSheet("border: none; image: none; padding-left: 4px")
        margins = editor.contentsMargins()
        margins.setBottom(1)
        margins.setRight(1)
        editor.setContentsMargins(margins)
        return editor
 
 
if __name__ == '__main__':
    app = QApplication([])
 
    data = [[98.23, 982, 1473],
            [34.34, 343, 515],
            [74.0, 740, 1110],
            [34.23, 342, 513],
            [43.54, 435, 653],
            ['', '', ''],
            [284.34, 2842, 4264]]
 
    model = CustomTableModel(data)
    view = QTableView()
    view.delegate = PaddingDelegate()
    view.setGeometry(QtCore.QRect(500, 200, 400, 300))
    view.horizontalHeader().setVisible(False)
    view.verticalHeader().setVisible(False)
    font = QtGui.QFont()
    font.setFamily("Bahnschrift SemiLight SemiConde")
    font.setPointSize(10)
    view.setFont(font)
    view.setStyleSheet("QTableView {\n"
                       "background-color: rgba(200, 255, 200, 255);\n"
                       "selection-color: rgb(0, 0, 0);\n"
                       "selection-background-color: rgba(255, 255, 255, 180)}\n"
                       "}")
    view.setItemDelegate(view.delegate)
    view.setModel(model)
    view.show()
 
    app.exec()
Схема простая:
1ый столбец: вводимые значения типа 0.00 (а)
2ой столбец: а * 10 тип целое
3ий столбец: а * 15 тип целое (рубли)
Последняя строка: итоговая сумма

НУЖНО:
1. Возможность редактирования только первого столбца до пятой строки включительно
1.1. Убрать возможность выделения (вообще какого либо взаимодействия) 6ой строки
2. Разобраться с проблемой бесконечных нулей после запятой в вычислениях (скрин, код)
Вроде справился, но может кто знает более изящный способ
3. Добавить к элементам 3го столбца символ рубля (скрин)
Подозреваю что это надо делать в делегате в методе displaytext, но там кажется не отслеживается параметр column. Я сам сдаюсь)
4. Как сделать чтобы у разных столбцов (строк) были разные шрифты и т.п.?
5. Как убрать кнопочки при редактировании (скрин)
6. Пожелания по улучшению кода в целом





Буду очень рад любой помощи.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.02.2024, 22:31
Ответы с готовыми решениями:

Правильное оформление
Как правильно оформить данный слайдер, учитывая что там должно быть 12 блоков, из которых 4 показывают?(без скрипта) чтобы никто не...

Правильное оформление конфига
Здравствуйте, есть сервер с apache2, на нём примерно 20 поддоменов, оформленных следующим образом: &lt;VirtualHost *:80&gt; ...

Правильное оформление стилей в js
Как более правильно менять стили в js, Напрямую (1способ) или через поиск в документе (2способ) ? Как будет грамотней? ...

6
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
22.02.2024, 00:02
Лучший ответ Сообщение было отмечено Nyura как решение

Решение

по вопросу 2 - round
Python
1
2
3
>>> round(1.2222222,2)
1.22
>>>
по вопросу 1,3
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    def data(self, index, role):
        if index.isValid():
            row,col = index.row(),index.column()
            if role == Qt.DisplayRole or role == Qt.EditRole:
                value = self._data[row][col]
                if col == 2:
                    return str(value) + ' \u20bd'
                return value
 
     def flags(self, index):
        if index.isValid():
            row,col = index.row(),index.column()
            if col==0 and row < 5:
                return Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable
        return Qt.ItemIsEnabled
можно через делегат, но ЕЯПП этот столбец не редактируется

Добавлено через 14 минут
по вопросу 4 -
Python
1
2
3
4
5
6
7
8
9
10
11
12
    def data(self, index, role):
        if index.isValid():
            row,col = index.row(),index.column()
            if role == Qt.DisplayRole or role == Qt.EditRole:
                value = self._data[row][col]
                if col == 2:
                    return str(value) + ' \u20bd'
                return value
            if role == Qt.FontRole:
                if col == 0:
                    return QFont('courier',18)
                return QFont('monospace', 14)
Добавлено через 5 минут
знак рубля не все шрифты рисуют
по редактированию - это автоматом идет если число редактируешь
или свой делегат или число->строка и наоборот
1
0 / 0 / 0
Регистрация: 20.12.2023
Сообщений: 27
22.02.2024, 09:20  [ТС]
Большое спасибо друг. Скоро сяду дописывать

Добавлено через 4 часа 1 минуту
У меня не работает Qt.FontRole, точнее не распозналось

Добавлено через 1 час 13 минут
Вопросы с 1, 1.1, 2 полностью решились. С 3им хотелось бы по другому, чтобы символ рубля был как формат, а не просто присваивался к числу.
Решение для 4го не работает. Вопросы далее еще актуальны.
Дополнительный вопрос как убрать штриховую рамку вокруг выделенного элемента?
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
from PyQt6.QtCore import Qt, QAbstractTableModel, QModelIndex
from PyQt6.QtWidgets import QApplication, QTableView
from PyQt6 import QtWidgets, QtCore, QtGui
 
 
def toFixed(Obj, digits=0):
    return f"{Obj:.{digits}f}"
 
 
class CustomTableModel(QAbstractTableModel):
    def __init__(self, data):
        super().__init__()
        self._data = data
 
    def rowCount(self, parent=QModelIndex()):
        return len(self._data)
 
    def columnCount(self, parent=QModelIndex()):
        return len(self._data[0])
 
    def data(self, index, role=Qt.ItemDataRole.DisplayRole):
        if index.isValid():
            if role == Qt.ItemDataRole.DisplayRole or role == Qt.ItemDataRole.EditRole:
                row, col = index.row(), index.column()
                if row != 5 and col == 2:
                    return f"{self._data[row][col]} \u20bd"
                return self._data[row][col]
 
        def flags(self, index):
        if index.isValid():
            row, col = index.row(), index.column()
            if row < 5 and col == 0:
                return Qt.ItemFlag(Qt.ItemFlag.ItemIsEnabled |
                                   Qt.ItemFlag.ItemIsSelectable | Qt.ItemFlag.ItemIsEditable)
            if row == 5:
                return Qt.ItemFlag(False)
        return Qt.ItemFlag(Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable)
 
    def setData(self, index, value, role=Qt.ItemDataRole.EditRole):
        if role == Qt.ItemDataRole.EditRole:
            row, col = index.row(), index.column()
            self._data[row][col] = value
            self._data[row][col + 1] = toFixed(float(value) * 10)
            self._data[row][col + 2] = toFixed(float(value) * 15)
 
            self._data[6][col] = \
                round(sum([float(self._data[i][col]) for i in range(5)]), 2)
            self._data[6][col + 1] = \
                sum([int(self._data[i][col + 1]) for i in range(5)])
            self._data[6][col + 2] = \
                sum([int(self._data[i][col + 2]) for i in range(5)])
 
            self.layoutChanged.emit()
            self.dataChanged.emit(index, index, [role])
            return True
        return False
 
 
class PaddingDelegate(QtWidgets.QStyledItemDelegate):
    def __init__(self, parent=None):
        super(PaddingDelegate, self).__init__(parent)
 
    def displayText(self, text, locale):
        return f" {text} "
 
    def initStyleOption(self, option, index):
        super().initStyleOption(option, index)
        if index.column() != 0 and index.column() != 1:
            option.displayAlignment = Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter
 
    def createEditor(self, parent, option, index):
        editor = super().createEditor(parent, option, index)
        editor.setStyleSheet("border: none; image: none; padding-left: 4px")
        margins = editor.contentsMargins()
        margins.setBottom(1)
        margins.setRight(1)
        editor.setContentsMargins(margins)
        return editor
 
 
if __name__ == '__main__':
    app = QApplication([])
 
    data = [[98.23, 982, 1473],
            [34.34, 343, 515],
            [74.0, 740, 1110],
            [34.23, 342, 513],
            [43.54, 435, 653],
            ['', '', ''],
            [284.34, 2842, 4264]]
 
    model = CustomTableModel(data)
    view = QTableView()
    view.delegate = PaddingDelegate()
    view.setGeometry(QtCore.QRect(500, 200, 400, 300))
    view.horizontalHeader().setVisible(False)
    view.verticalHeader().setVisible(False)
    font = QtGui.QFont()
    font.setFamily("Bahnschrift SemiLight SemiConde")
    font.setPointSize(10)
    view.setFont(font)
    view.setStyleSheet("QTableView {\n"
                       "background-color: rgba(180, 230, 180, 255);\n"
                       "selection-color: rgb(0, 0, 0);\n"
                       "selection-background-color: rgba(255, 255, 255, 60)}\n"
                       "}")
    view.setItemDelegate(view.delegate)
    view.setModel(model)
    view.show()
 
    app.exec()
Добавлено через 19 минут
Дополнительный вопрос закрыт: view.setFocusPolicy(Qt.FocusPolicy.NoFoc us)

Добавлено через 1 час 10 минут
С пятым вопросом тоже разобрался
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
22.02.2024, 09:59
ты меняешь делегат поэтому FontRole не работает
Миниатюры
Правильное оформление QTableView PyQt6  
0
0 / 0 / 0
Регистрация: 20.12.2023
Сообщений: 27
22.02.2024, 11:02  [ТС]
Через paint смог задать разные цвета шрифта, хоть что то. Не знаю правильно ли это с точки зрения этики
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
22.02.2024, 11:37
Цитата Сообщение от Nyura Посмотреть сообщение
с точки зрения этики
с этой точки лучше что-то одно - модель, делегат или stylesheet
0
0 / 0 / 0
Регистрация: 20.12.2023
Сообщений: 27
22.02.2024, 11:39  [ТС]
Ну paint внутри делегата, получается норм)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.02.2024, 11:39
Помогаю со студенческими работами здесь

Правильное оформление проекта
Решил выучить Xamarin.Forms. Подскажите, как правильно оформлять проект. Знаю, что в C++ нужен для каждого класса отдельный хедер и cpp...

Правильное оформление кода
Возникло несколько вопросов по оформлению 1. Важны ли комментарии к коду? 2. Предположим, есть у меня три класса. Выполняют разную...

Правильное оформление запроса
Привет всем. Интересует следующий вопрос : как грамотно оформить запрос, чтобы не возможно было использовать SQL Injection ? ...

Правильное оформление Dcount
Добрый день форумчане, подскажите пожалуйста, как правильно оформить текст в условии dcount. ...

Правильное оформление друж-х ф-й
Добрый вечер! Компилятор ругается на то, что друж-я ф-ция использует private - поля класса. Попробовал положить определение в StdAfx.h, а...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru