Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
1
PyQt5

Отображение модели с измененным типом данных

09.04.2020, 20:19. Показов 1294. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как изменить тип данных (необходимо добавить несколько литер к целому значению для отображения в удобочитаемой форме) значения модели базы данных QSqlTableModel() для отображения в QTableView(). MVC паттерн выглядит так: DataBase --- QSqlTableModel()---QTableView(). Возможен или нет вариант использования промежуточных моделей QSortFilterProxyModel?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.04.2020, 20:19
Ответы с готовыми решениями:

Отображение в QListView данных модели
Доброго времени суток! http://s50.***********/i130/1106/17/8d09bfcded08.png Имеются объекты...

Отображение данных таблицы: поле с типом данных "Логический"
Здравствуйте. Наверное глупый вопрос. Есть таблица, в ней есть поле с типом данных "Логический". ...

Не правильное отображение данных модели QSqlQueryModel
День добрый! есть проблема не пойму, что ни так, есть проект с двумя TableView, на первом показан...

Отображение логической модели предметной области в структуру базы данных
Отображение логической модели предметной области в структуру базы данных. Как ответить на такой...

18
930 / 691 / 270
Регистрация: 10.12.2016
Сообщений: 1,701
14.04.2020, 04:22 2
КМК проще свою модель сделать на основе QAbstractTableModel
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
14.04.2020, 07:35  [ТС] 3
vic5710, с нуля все классы перестраивать...долго, я рассматривал...дополнил БД дополнительным столбцом и через локаль (или регулярки) вывод на отображаемый столбик
0
930 / 691 / 270
Регистрация: 10.12.2016
Сообщений: 1,701
14.04.2020, 11:54 4
Лучший ответ Сообщение было отмечено AlexMarkov как решение

Решение

ИМХО неверно менять БД для изменения отображения. можно через делегата
https://github.com/baoboa/pyqt... elegate.py

Добавлено через 1 час 17 минут
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
from PyQt5.QtWidgets import QListView,QTableView, QItemDelegate,QApplication
from PyQt5.QtGui import QStandardItemModel,QStandardItem
from PyQt5.QtCore import Qt
 
 
class Delegate(QItemDelegate):
    def __init__(self):
        super().__init__()
    
    def paint(self,painter,option,index):
        if index.row() != 1:
            QItemDelegate.paint(self,painter,option,index)
            return
        txt = 'Delegate : ' + index.data()
        option.font.setItalic(True)
        self.drawDisplay(painter,option,option.rect,txt)
 
class View(QTableView):
    def __init__(self):
        super().__init__()
        self.model = QStandardItemModel()
        self.setSelectionMode(1)
        for row in range(4):
            for col in range(3):
                item = QStandardItem(str(row)+":"+str(col))
                self.model.setItem(row,col,item)
        self.setModel(self.model)
        d = Delegate()
        self.setItemDelegate(d)
 
 
if __name__ == "__main__":
    app = QApplication([])
    w = View()
    w.resize(600,400)
    w.show()
    app.exec_()
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
17.04.2020, 17:37  [ТС] 5
vic5710, no comment
vic5710, закомментируйте пожалуйста строки класса Delegate и строки View, где класс делегата используется, не могу понять
0
930 / 691 / 270
Регистрация: 10.12.2016
Сообщений: 1,701
17.04.2020, 17:49 6
Python
1
2
3
4
5
6
7
8
9
10
11
12
class Delegate(QItemDelegate):
    def __init__(self):
        super().__init__()
    
    def paint(self,painter,option,index):
        print(index.row(),index.column(), index.data()) #все определяется тут
        if index.row() != 1:
            QItemDelegate.paint(self,painter,option,index)
            return
        txt = 'Delegate : ' + index.data()
        option.font.setItalic(True)
        self.drawDisplay(painter,option,option.rect,txt)
Python
1
2
        d = Delegate()
        self.setItemDelegate(d) #делегат присоединяется здесь
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
17.04.2020, 18:24  [ТС] 7
vic5710, я хотел бы понять возможность применения данного делегата к модели типа QSqlRelationalTableModel и отображению типа TableView(), в случае "инсёрта" в базу данных значений через отдельное диалоговое окно, которое реализовано в отдельном модуле.

Добавлено через 8 минут
Структура кода:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class MainWindow(QtWidgets.QMainWindow):
    """Класс главного окна
    """
 
    def __init__(self, *args, **kwargs):
        """
        Инициализация
        """
        super(MainWindow, self).__init__(*args, **kwargs)
 
     # СОЕДИНЕНИЕ С БАЗОЙ ДАННЫХ И СОЗДАНИЕ ТАБЛИЦЫ
 
     # ПРЕДСТАВЛЕНИЕ МОДЕЛИ БАЗЫ ДАННЫХ (VIEW)
 
     def loaddata(self): # функция обновления отображения
 
         # МОДЕЛЬ ПОДДЕРЖИВАЮЩАЯ МЕЖТАБЛИЧНЫЕ СВЯЗИ
В отдельном модуле редактирование самой базы данных

Возможно или нет применение делегатов в модуле главного диалогового окна, если да, то как примерно должна выглядеть структура кода в таком случае.
Какие классы, методы и экземпляры для работы с "Делегатами" применяются в таких случаях. Применим или нет Ваш пример кода?

Добавлено через 10 минут
Я понимаю, что так сложно ответить и необходим конкретный пример работающего кода (код достаточно большой и нет возможности его предоставить), мне необходимы "теоретические предпосылки" для решения данной проблемы...пока еще не весь материал документации PyQt5 изучен...
0
243 / 178 / 73
Регистрация: 17.10.2018
Сообщений: 749
17.04.2020, 18:43 8
Цитата Сообщение от AlexMarkov Посмотреть сообщение
Как изменить тип данных (необходимо добавить несколько литер к целому значению для отображения в удобочитаемой форме)
Конкретнее можно? Пример, что у Вас есть и что Вы хотите получить.
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
17.04.2020, 19:26  [ТС] 9
Отображение модели с измененным типом данных


Используя делегаты, класс MainWindow() см. выше, значение 19.59 м3 только для отображения, само значение остается вещественным числом 19.5878555
0
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
17.04.2020, 19:30  [ТС] 10
Lekks, необходим ориентир, какие методы использовать, что из документации прочитать...Пример предоставленный vic5710, применим в этой ситуации?
0
930 / 691 / 270
Регистрация: 10.12.2016
Сообщений: 1,701
17.04.2020, 19:32 11
Цитата Сообщение от AlexMarkov Посмотреть сообщение
vic5710, я хотел бы понять возможность применения данного делегата к модели типа QSqlRelationalTableModel и отображению типа TableView(), в случае "инсёрта" в базу данных значений через отдельное диалоговое окно, которое реализовано в отдельном модуле.
делегат применяется к вьюхе и не влияет на модель. все можно сделать в ф-ции paint, делегат простейший
в моем примере определяется номер строки
1
243 / 178 / 73
Регистрация: 17.10.2018
Сообщений: 749
17.04.2020, 19:51 12
vic5710 предложил неплохой и возможно единственный способ. По крайне мере, я навскидку ничего более подходящего предложить не могу. Почитайте про делегаты. Вообще - нужная вещь, в том числе применимая в Вашей ситуации.
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
17.04.2020, 19:51  [ТС] 13
Цитата Сообщение от vic5710 Посмотреть сообщение
делегат применяется к вьюхе и не влияет на модель
vic5710, я понимаю что к вьюхе, проблема при обновлении значений при объявлении новых переменных.
Цитата Сообщение от vic5710 Посмотреть сообщение
все можно сделать в ф-ции paint
прокомментируйте пожалуйста функцию paint, параллельно рассматриваю другие методы, не всегда есть время и требуется сторонняя точка зрения. Для чего она предназначена, что объявляется в качестве атрибутов данной функции...
0
243 / 178 / 73
Регистрация: 17.10.2018
Сообщений: 749
17.04.2020, 19:55 14
Цитата Сообщение от AlexMarkov Посмотреть сообщение
проблема при обновлении значений при объявлении новых переменных.
Вы бы конкретные примеры приводили все-таки)))

Цитата Сообщение от AlexMarkov Посмотреть сообщение
прокомментируйте пожалуйста функцию paint,
Почитайте про класс QItemDelegate и его методы. Галопом по европам все равно не получится, а если получится, то плохо )))
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
17.04.2020, 20:04  [ТС] 15
Lekks,
Цитата Сообщение от Lekks Посмотреть сообщение
vic5710 предложил неплохой и возможно единственный способ
Да это решение и я понимаю ..., только код без комментариев бесполезен для человека...я хотел бы узнать поподробнее про применяемые в данном примере методы...вот и всё...конкретно на примере...в документации нет примера...

Добавлено через 3 минуты
Цитата Сообщение от Lekks Посмотреть сообщение
Почитайте про класс QItemDelegate и его методы
прочитаю)
0
930 / 691 / 270
Регистрация: 10.12.2016
Сообщений: 1,701
17.04.2020, 20:58 16
Цитата Сообщение от AlexMarkov Посмотреть сообщение
прокомментируйте пожалуйста функцию paint
https://doc.qt.io/qt-5/qitemdelegate.html#paint
Повторно реализует: QAbstractItemDelegate::краски(рисовальщика QPainter *живописец, вариант QStyleOptionViewItem как const&, с const QModelIndex &Index) и константный.

Визуализирует делегат, используя заданный параметр painter и style для элемента, указанного в индексе.

При повторном отображении этой функции в подклассе следует обновить область, удерживаемую переменной rect опции, используя переменную состояния опции для определения состояния отображаемого элемента и соответствующим образом скорректировать способ его отображения.

Например, выбранный элемент может потребоваться отобразить иначе, чем невыбранные элементы, как показано на следующем рисунке
0
243 / 178 / 73
Регистрация: 17.10.2018
Сообщений: 749
17.04.2020, 20:59 17
Цитата Сообщение от vic5710 Посмотреть сообщение
Повторно реализует: QAbstractItemDelegate::краски(рисовальщика QPainter *живописец,

0
930 / 691 / 270
Регистрация: 10.12.2016
Сообщений: 1,701
17.04.2020, 21:15 18
добавь в делегат признак какой нибудь
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
from PyQt5.QtWidgets import QListView,QTableView, QItemDelegate,QApplication
from PyQt5.QtGui import QStandardItemModel,QStandardItem, QPalette, QBrush, QPen
from PyQt5.QtCore import Qt
 
 
class Delegate(QItemDelegate):
    def __init__(self):
        super().__init__()
        self.rows = []
        self.cols = []
 
    def paint(self,painter,option,index):
        row, col = index.row(), index.column()
        if row not in self.rows or col not in self.cols:
            QItemDelegate.paint(self,painter,option,index)
            return
        txt = index.data()
        num = float(txt)
        if not num % 3:
            txt = str(round(num,2)) + ' $'
        option.font.setItalic(True)
        option.palette.setColor(QPalette.Text, Qt.red)
        painter.setBrush(QBrush(Qt.green))
        painter.drawRect(option.rect)     
        self.drawDisplay(painter,option,option.rect,txt)
 
 
class View(QTableView):
    def __init__(self):
        super().__init__()
        self.model = QStandardItemModel()
        self.setSelectionMode(1)
        for row in range(5):
            for col in range(5):
                item = QStandardItem(str(row)+str(col))
                self.model.setItem(row,col,item)
        self.setModel(self.model)
        d = Delegate()
        d.rows = [0,2,4]
        d.cols = [1,3,4]
        self.setItemDelegate(d)
 
 
if __name__ == "__main__":
    app = QApplication([])
    w = View()
    w.resize(600,400)
    w.show()
    app.exec_()
Добавлено через 27 секунд
Lekks, Яндекс перевод
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
17.04.2020, 21:32  [ТС] 19
vic5710,
Интернет о функции paint():

Делегаты способны самостоятельно отрисовывать свое содержимое, реализовав функции paint() и sizeHint().
Цитата Сообщение от vic5710 Посмотреть сообщение
добавь в делегат признак какой нибудь
ладно буду юзать, спасибо.
0
17.04.2020, 21:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.04.2020, 21:32
Помогаю со студенческими работами здесь

Нужно перевести переменную с типом данных string в переменную с типом данных REAL
Итак, нужно перевести переменную с типом данных string в переменную с типом данных REAL. Переменную...

Дать определение модели данных и назвать основные модели данных
Дать определение модели данных и назвать основные модели данных. Только начал изучать базы...

Отображение в таблице полей с типом подстановка
Если в таблицу подставляются данные из другой таблицы через мастер подст., то некоторые текстовые...

Отображение русского языка в поле с типом NTEXT
Использую MS SQL 2012. Создаю новый столбец в БД. Называю ее Description, типом ее является...

Выбор в таблице данных модели ссылки на экземпляр связанной модели
Есть ли какой-то автоматизированный способ вывести на страницу таблицу с записями модели, одно из...

Обновление данных одной модели из другой модели
Здравствуйте, имеются 2 модели class Closing(models.Model): noteid =...

Отображение 3D модели
Друзья, Хочу отобразить в каком-то View модельку, созданную в 3DMax\Blender\Maya. Есть ли для...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru