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

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

20.10.2021, 14:37. Показов 7730. Ответов 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
964 / 719 / 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
964 / 719 / 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
964 / 719 / 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
964 / 719 / 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
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru