Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/34: Рейтинг темы: голосов - 34, средняя оценка - 4.79
2 / 2 / 2
Регистрация: 12.05.2016
Сообщений: 67
PyQt5

Делегат перекрашивания ячейки QTableView

20.10.2021, 14:37. Показов 7428. Ответов 24

Студворк — интернет-сервис помощи студентам
Всем привет, есть небольшой код с GUI-окном и БД (во вложении).
Окно делится на две части, в верхней части вводится информация которую необходимо добавить в БД (отображение снизу).
Информация добавляется через кнопку Добавить.

Пы.Сы.
Я пытаюсь добавить делегаты к QTableView, У меня получилось добавить делегат, который центрирует текст в ячейках,
но у меня никак не получается "сварганить" делегат, который бы в столбце "На контроле" при значении столбца "1" перекрашивал бы ячейку столбца в красный цвет.

Пы.Сы.Пы.Сы.
1.архив распаковать в папку (в архиве бд + gui + скрипт).
2.запускать main.py

Пы.Сы.Пы.Сы.Пы.Сы
В коде есть работающая строка поиска, кнопки Добавить и Удалить добавляют и удаляют строки в исходную модель, но такое не прокатывает с отфильтрованной моделью, как реализовать добавление/удаление строк в отфильтрованной модели? (QSortFilterProxyModel).

Дублирую основной код:
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
from mainWindow import Ui_MainWindow #основное GUI-окно
#import reestr_pb #реестр PB второе окно
from PyQt5 import QtCore, QtGui, QtWidgets, Qt
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QMessageBox #интерфейс
from PyQt5.QtSql import QSqlDatabase, QSqlTableModel, QSqlQueryModel
 
#import configparser #библиотека для чтения настроек из файла settings.ini
import sys
 
class MainApp(QMainWindow, Ui_MainWindow): #основной класс главного окна
    def __init__(self, parent=None):
        super(MainApp,self).__init__(parent)
        self.setupUi(self) #иницилизация главного окна
        self.Init_Ui() #инициализация привязок к кнопкам главного окна
  
    def Init_Ui(self): #привязка функций к кнопкам
        self.CreateConnection()
        self.CreateModel()
        #self.reestr.clicked.connect(self.openReestr)  # Кнопка открытия реестра
        self.StatusPB.clicked.connect(self.addRecord)
        self.DelPB.clicked.connect(self.delRecord)
 
        # строка поиска
        self.filter_proxy_model = QtCore.QSortFilterProxyModel()
        self.filter_proxy_model.setSourceModel(self.model)
        self.filter_proxy_model.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive)
        self.filter_proxy_model.setFilterKeyColumn(2)
        search_field = self.search
        search_field.textChanged.connect(self.filter_proxy_model.setFilterRegExp)
        self.MainReestr.setModel(self.filter_proxy_model)  # привязка отфильтрованной модели к таблице
        self.MainReestr.resizeColumnsToContents()  # ресайз размера колонок по содержимому
        self.MainReestr.hideColumn(0)  # Скрываем столбец с ID
        #центрирование содержимого столбцов в таблице
        delegate = AlignDelegate(self.MainReestr)
        for x in range(12):
            self.MainReestr.setItemDelegateForColumn(x, delegate)
 
 
    def addRecord(self): #добавление в неотфильтрованную модель
        record = self.model.record()
        record.setValue(1, self.untb.text())
        record.setValue(2, self.fio.text())
        record.setValue(3, str(self.birthdate.date().toPyDate()))
        record.setValue(4, self.dul.text())
        record.setValue(6, self.newStatusPB.text())
        record.setValue(7, self.inoBank.text())
        record.setValue(8, self.oes.text())
        record.setValue(9, self.control.text())
        record.setValue(10, self.sanction.text())
        record.setValue(11, self.comment.text())
        self.model.insertRecord(-1, record)
        self.model.select()
 
 
    def delRecord(self, MainReestr): #удаление из неотфильтрованной модели
        index = self.MainReestr.currentIndex()
        if not index.isValid():
            return
        record = self.model.record(index.row())
        self.model.removeRow(index.row())
        self.model.submitAll()
        self.model.select()
 
    #def openReestr(self):
    #    self.operR = reestrWidget()
    #    self.operR.show()
 
    def CreateConnection(self):
        con = QSqlDatabase.addDatabase("QSQLITE")
        con.setDatabaseName("clients.db")
        if not con.open():
            QMessageBox.critical(None,"QTableView Example - Error!", "Database Error: %s" % con.lastError().databasetext(),)
            return False
        return True
 
    def CreateModel(self):
        self.model = QSqlTableModel(self)
        self.model.setTable('mainReestr')
        self.model.setEditStrategy(QSqlTableModel.OnFieldChange)
        self.model.setHeaderData(1, QtCore.Qt.Horizontal, 'УНТБ')
        self.model.setHeaderData(2, QtCore.Qt.Horizontal, 'ФИО')
        self.model.setHeaderData(3, QtCore.Qt.Horizontal, 'Дата рождения')
        self.model.setHeaderData(4, QtCore.Qt.Horizontal, 'ДУЛ')
        self.model.setHeaderData(5, QtCore.Qt.Horizontal, 'Статус')
        self.model.setHeaderData(6, QtCore.Qt.Horizontal, 'Присвоение статуса')
        self.model.setHeaderData(7, QtCore.Qt.Horizontal, 'Запрос инобанка')
        self.model.setHeaderData(8, QtCore.Qt.Horizontal, 'Отказ')
        self.model.setHeaderData(9, QtCore.Qt.Horizontal, 'На контроле')
        self.model.setHeaderData(10, QtCore.Qt.Horizontal, 'Санкции')
        self.model.setHeaderData(11, QtCore.Qt.Horizontal, 'Комментарий')
        self.model.select()
 
class AlignDelegate(QtWidgets.QStyledItemDelegate): #делегат центрирования содержимого в столбцах
    def initStyleOption(self, option, index):
        super(AlignDelegate, self).initStyleOption(option, index)
        option.displayAlignment = QtCore.Qt.AlignCenter
 
if __name__ == '__main__':
    app = QApplication(sys.argv) #новый экземпляр класса QApplication
    window = MainApp()  #объект класса MainApp
    window.show() #запускаем окно
    app.exec_() #запускаем приложение
Вложения
Тип файла: rar example.rar (4.6 Кб, 17 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.10.2021, 14:37
Ответы с готовыми решениями:

Делегат перекрашивания строки по условию в столбце QTableView
Всем привет. У меня есть вот такой делегат, который по условию в колонке перекрашивает ячейку 26 или 27 колонки в красный цвет. ...

Удалить делегат из QTableView
Добрый день! Как удалить делегат из QTableView? Нашел в теме то что нужно: view->setItemDelegateForColumn(2, NULL); Как...

Делегат QCheckBox в QTableView
Всем привет. Написал делегат: class FlagDelegate (QtWidgets.QStyledItemDelegate): def createEditor (self, parent, options,...

24
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
27.10.2021, 17:51
Студворк — интернет-сервис помощи студентам
T4gr0id, из вашего первого сообщения все перезаписывается
ИМХО все что вам надо сделать - делегата переписать
Python
1
2
3
4
5
6
7
8
9
10
11
12
class AlignDelegate(QtWidgets.QStyledItemDelegate):
    def __init__(self,parent=None):
        super().__init__()
        
    def paint(self,painter,option,index):
        option.displayAlignment = QtCore.Qt.AlignCenter
        col,_data = index.column(), index.data()
        if col == 9 and _data == 1:
            painter.setBrush(QtGui.QColor(255,0,0))
            painter.setPen(QtCore.Qt.NoPen)
            painter.drawRect(option.rect)
        QtWidgets.QStyledItemDelegate.paint(self,painter,option,index)
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
27.10.2021, 17:55
скриншот
Миниатюры
Делегат перекрашивания ячейки QTableView  
0
2 / 2 / 2
Регистрация: 12.05.2016
Сообщений: 67
28.10.2021, 07:26  [ТС]
Добрый день, там есть кнопка "Добавить". Заполняете любые поля в верхней части, нажимаете на эту кнопку и в БД добавляется строка(отобразится снизу). После попробуйте отредактировать ячейку строки любую, кликнув на нее.

Добавлено через 21 минуту
vic5710, кажется я вкурил! Делегаты перезаписывали друг друга! Получилось!
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
28.10.2021, 09:17
Лучший ответ Сообщение было отмечено T4gr0id как решение

Решение

Цитата Сообщение от T4gr0id Посмотреть сообщение
Делегаты перезаписывали друг друга
я бы что-то одно делал - или через делегат или через модель.
можно покомпактнее оформить
Python
1
2
3
4
5
6
7
8
9
10
class AlignDelegate(QtWidgets.QStyledItemDelegate):
    def __init__(self,parent=None):
        super().__init__()
        
    def paint(self,painter,option,index):
        option.displayAlignment = QtCore.Qt.AlignCenter
        col,_data = index.column(), index.data()
        if col == 9 and _data == 1:
            painter.fillRect(option.rect, QtCore.Qt.red)
        QtWidgets.QStyledItemDelegate.paint(self,painter,option,index)
1
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
28.10.2021, 09:23
все сохранилось
Миниатюры
Делегат перекрашивания ячейки QTableView  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.10.2021, 09:23
Помогаю со студенческими работами здесь

Делегат отображения даты и суммы из таблицы sqlite3 в QTableView
Всем привет. Помогите разобраться с проблемой, которую я не осилил - перерыл интернет, но так и не нашел подходящего решения. 1. Есть...

QTableView + делегат
Доброго времени суток. Придумал тут одну идею, но опыта в таких делах очень мало. Есть таблица, с одним столбцом. В котором перечислены...

QTableView удалить делегат
Здравствуйте, подскажите, как удалить делегат с таблицы? dataTable = new UsersTable(this); view = new QTableView (this); ...

Делегат QComboBox в модели QTableView
Добрый день товарищи. Появилась проблема которую не могу решить уже очень долгое время. В общем, у меня есть модель QTableView в которой я...

Не работает делегат для QTableview
Всем привет Помогите, пожалуйста, целый день сижу, мозг кипит :wall: Делаю по образцу "Star Delegate Example" Только вот...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru