Russian Qt Forum
Ноябрь 25, 2024, 04:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: QTableWidgetItem  (Прочитано 17621 раз)
Dr.robot
Гость
« Ответ #15 : Январь 18, 2017, 15:24 »

Типа такого? Смеющийся

Вам смешно а я уже очень много времени потратил на это))))
Очень много информации на C++ но на питон очень мало.

Вот что у меня если я просто использую Pixmap
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #16 : Январь 18, 2017, 16:11 »

Так ведь на с++ и питоне один и тот же Qt
самое большое различие -- способ коннекта, остальное -- различие языков, если вы пользуетесь IDE PyCharm, то вам проще писать код

Попробуйте найти пример делегата на с++ и просто перепишите код на питон.
Можете тут вопросы задавать, на питоне я вот уже почти 3 года что-нибудь для себя пишу смогу подсказать

« Последнее редактирование: Январь 18, 2017, 16:13 от gil9red » Записан

gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #17 : Январь 20, 2017, 13:36 »

Набросал я простенький пример использования делегата для отрисовки.

Ну и весь код:
Код
Python
try:
   from PyQt5.QtWidgets import *
   from PyQt5.QtGui import *
   from PyQt5.QtCore import *
except:
   from PyQt4.QtCore import *
   from PyQt4.QtGui import *
 
 
# Для отлова всех исключений, которые в слотах Qt могут "затеряться" и привести к тихому падению
def log_uncaught_exceptions(ex_cls, ex, tb):
   text = '{}: {}:\n'.format(ex_cls.__name__, ex)
   import traceback
   text += ''.join(traceback.format_tb(tb))
 
   print('Error: ', text)
   QMessageBox.critical(None, 'Error', text)
   quit()
 
 
import sys
sys.excepthook = log_uncaught_exceptions
 
 
def create_item(img):
   item = QTableWidgetItem()
   item.setData(Qt.DecorationRole, img)
 
   return item
 
 
class MyDelegate_1(QStyledItemDelegate):
   def paint(self, painter, option, index):
       img = index.model().data(index, Qt.DecorationRole)
       if img is None:
           super().paint(painter, option, index)
           return
 
       rect = option.rect
       w, h = rect.size().width(), rect.size().height()
       img = img.scaled(w, h, Qt.KeepAspectRatio, Qt.SmoothTransformation)
 
       painter.drawPixmap(rect, img)
 
       item_option = QStyleOptionViewItem(option)
       self.initStyleOption(item_option, index)
 
       # Обработка при выделении ячейки делегата
       # Рисуем выделение полупрозрачным чтобы было видно нарисованное ранее
       if item_option.state & QStyle.State_Selected:
           color = item_option.palette.color(QPalette.Highlight)
           color.setAlpha(180)
 
           painter.save()
           painter.setPen(Qt.NoPen)
           painter.setBrush(color)
           painter.drawRect(rect)
           painter.restore()
 
       # Если хотим что-то дорисовать (например текст)
       # super().paint(painter, option, index)
 
 
class MyDelegate_2(QStyledItemDelegate):
   def paint(self, painter, option, index):
       img = index.model().data(index, Qt.DecorationRole)
       if img is None:
           super().paint(painter, option, index)
           return
 
       rect = option.rect
       x, y = rect.x(), rect.y()
       painter.drawPixmap(x, y, img)
 
       painter.drawPixmap(x + 16, y, img)
       painter.drawPixmap(x + 32, y, img)
       painter.drawPixmap(x + 48, y, img)
       painter.drawPixmap(x + 64, y, img)
       painter.drawPixmap(x + 80, y, img)
 
       painter.drawPixmap(x, y + 16, img)
       painter.drawPixmap(x + 16, y + 16, img)
 
       item_option = QStyleOptionViewItem(option)
       self.initStyleOption(item_option, index)
 
       # Обработка при выделении ячейки делегата
       # Рисуем выделение полупрозрачным чтобы было видно нарисованное ранее
       if item_option.state & QStyle.State_Selected:
           color = item_option.palette.color(QPalette.Highlight)
           color.setAlpha(180)
 
           painter.save()
           painter.setPen(Qt.NoPen)
           painter.setBrush(color)
           painter.drawRect(rect)
           painter.restore()
 
       # # Если хотим что-то дорисовать (например текст)
       # super().paint(painter, option, index)
 
 
if __name__ == '__main__':
   app = QApplication([])
 
   table = QTableWidget()
   table.setSelectionBehavior(QTableView.SelectRows)
   table.show()
   table.resize(400, 200)
 
   headers = ['Normal', 'Delegate v1', 'Delegate v1 (without img)', 'Delegate v2']
   table.setColumnCount(len(headers))
   table.setHorizontalHeaderLabels(headers)
   table.setRowCount(3)
   table.verticalHeader().hide()
 
   pix_1 = QPixmap('favicon_google.png')
   pix_2 = QPixmap('favicon_prog_org.png')
   pix_3 = QPixmap('favicon_google_tr.png')
 
   for col in range(table.columnCount()):
       if col == 2:
           table.setItem(1, col, QTableWidgetItem())
       else:
           table.setItem(0, col, create_item(pix_1))
           table.setItem(1, col, create_item(pix_2))
           table.setItem(2, col, create_item(pix_3))
 
   delegate_1 = MyDelegate_1()
   delegate_2 = MyDelegate_2()
 
   table.setItemDelegateForColumn(1, delegate_1)
   table.setItemDelegateForColumn(2, delegate_1)
   table.setItemDelegateForColumn(3, delegate_2)
 
   app.exec()
 
 
 

Выглядит вот так (первый столбец обычный, остальные имеют делегаты):

« Последнее редактирование: Январь 22, 2017, 23:37 от gil9red » Записан

Dr.robot
Гость
« Ответ #18 : Январь 20, 2017, 16:14 »

Ого спасибо буду разбираться (жаль сегодня, завтра не могу), еще раз спасибо!
Если что не пойму или будут вопросы отпишусь.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #19 : Январь 20, 2017, 16:21 »

gil9red, если есть время, закинь, пожалуйста, этот пример в раздел http://www.prog.org.ru/board_61_0.html
Думаю, полезно будет.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Dr.robot
Гость
« Ответ #20 : Январь 22, 2017, 15:26 »

Все работает хорошо спасибо.
Только не работает выделение ячейки по щелчку мыши(ну это мелочи).
Хотя выдает ошибку,
img = img.scaled(w, h, Qt.KeepAspectRatio, Qt.SmoothTransformation)
AttributeError: 'NoneType' object has no attribute 'scaled'
« Последнее редактирование: Январь 22, 2017, 17:08 от Dr.robot » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #21 : Январь 22, 2017, 19:42 »

Все работает хорошо спасибо.
Только не работает выделение ячейки по щелчку мыши(ну это мелочи).
Хотя выдает ошибку,
img = img.scaled(w, h, Qt.KeepAspectRatio, Qt.SmoothTransformation)
AttributeError: 'NoneType' object has no attribute 'scaled'

Если вы код не меняли все будет работать Улыбающийся

img берется из Qt.DecorationRole:
Код
Python
img = index.model().data(index, Qt.DecorationRole)

Если делегат используется для ячеек без картинки в Qt.DecorationRole, то нужно тогда в делегат добавить проверку на наличие значения в img,
например если img is None, тогда вызываем родительский метод отрисовки super().paint(painter, option, index) и выходим из функции рисования

« Последнее редактирование: Январь 22, 2017, 19:45 от gil9red » Записан

Dr.robot
Гость
« Ответ #22 : Январь 22, 2017, 21:03 »

Изначально пустые ячейки
Сделал примерно как ты сказал
Код
Python
class MyDelegate(QStyledItemDelegate):
   def paint(self, painter, option, index):
       painter.save()
 
       rect = option.rect
       img = index.model().data(index, Qt.DecorationRole)
       w, h = rect.size().width(), rect.size().height()
       if img is None:
           super().paint(painter, option, index)
           #painter(exit())
       else:
           img = img.scaled(w, h, Qt.KeepAspectRatio, Qt.SmoothTransformation)
           painter.drawPixmap(rect, img)
 
       item_option = QStyleOptionViewItem(option)
       self.initStyleOption(item_option, index)
 
       #Для полупрозрачности выделения
       if item_option.state & QStyle.State_Selected:
           color = item_option.palette.color(QPalette.Highlight)
           color.setAlpha(160)
 
           painter.setPen(Qt.NoPen)
           painter.setBrush(color)
           painter.drawRect(rect)
 
           painter.restore()
Уже меньше ругается  Улыбающийся
Пишет QPainter::end: Painter ended with 380 saved states
« Последнее редактирование: Январь 22, 2017, 21:13 от Dr.robot » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #23 : Январь 22, 2017, 23:24 »

Изначально пустые ячейки
Сделал примерно как ты сказал
Код
Python
class MyDelegate(QStyledItemDelegate):
   def paint(self, painter, option, index):
       painter.save()
 
       rect = option.rect
       img = index.model().data(index, Qt.DecorationRole)
       w, h = rect.size().width(), rect.size().height()
       if img is None:
           super().paint(painter, option, index)
           #painter(exit())
       else:
           img = img.scaled(w, h, Qt.KeepAspectRatio, Qt.SmoothTransformation)
           painter.drawPixmap(rect, img)
 
       item_option = QStyleOptionViewItem(option)
       self.initStyleOption(item_option, index)
 
       #Для полупрозрачности выделения
       if item_option.state & QStyle.State_Selected:
           color = item_option.palette.color(QPalette.Highlight)
           color.setAlpha(160)
 
           painter.setPen(Qt.NoPen)
           painter.setBrush(color)
           painter.drawRect(rect)
 
           painter.restore()
Уже меньше ругается  Улыбающийся
Пишет QPainter::end: Painter ended with 380 saved states

Я бы сделал так:
Код
Python
   def paint(self, painter, option, index):
       img = index.model().data(index, Qt.DecorationRole)
       if img is None:
           super().paint(painter, option, index)
           return
 
       rect = option.rect
       w, h = rect.size().width(), rect.size().height()
       img = img.scaled(w, h, Qt.KeepAspectRatio, Qt.SmoothTransformation)
 
       painter.drawPixmap(rect, img)
 
       item_option = QStyleOptionViewItem(option)
       self.initStyleOption(item_option, index)
 
       # Обработка при выделении ячейки делегата
       # Рисуем выделение полупрозрачным чтобы было видно нарисованное ранее
       if item_option.state & QStyle.State_Selected:
           color = item_option.palette.color(QPalette.Highlight)
           color.setAlpha(180)
 
           painter.save()
           painter.setPen(Qt.NoPen)
           painter.setBrush(color)
           painter.drawRect(rect)
           painter.restore()
 
 
       # Если хотим что-то дорисовать (например текст)
       # super().paint(painter, option, index)
 


Обновил тот код и сообщение с примером
« Последнее редактирование: Январь 22, 2017, 23:38 от gil9red » Записан

Dr.robot
Гость
« Ответ #24 : Январь 23, 2017, 01:00 »

Вот теперь все работает без ошибок и даже выделение работает!
Собственно и точка.
Спасибо огромнейшее!
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.117 секунд. Запросов: 23.