Название: QTableWidgetItem Отправлено: Dr.robot от Январь 16, 2017, 16:52 Здравствуйте у меня вопрос.
Добавляю картинку в ячейку таблицы следующим образом Код
Вставляется иконка и располагается с лева в ячейке, а мне нужно что бы картинка была на всю ячейку с оберткой DecorationRole. Все перепробовал не знаю что делать. Название: Re: QTableWidgetItem Отправлено: gil9red от Январь 17, 2017, 08:33 Для этого используются делегаты. Они рисуют ячейки
Т.е. вам нужно будет создать делегат, в его методе рисования собственно и нарисовать вашу иконку. Когда-то делал подобное (https://github.com/gil9red/combustion/blob/master/linedays_celldelegate.cpp) // В корне проекта можно будет увидеть скрины Название: Re: QTableWidgetItem Отправлено: Dr.robot от Январь 17, 2017, 11:23 Я хочу без делегата обойтись
Название: Re: QTableWidgetItem Отправлено: gil9red от Январь 17, 2017, 12:08 Название: Re: QTableWidgetItem Отправлено: Day от Январь 18, 2017, 11:31 Создаешь виджет (например QLabel *lab = new QLabel)
Заполняешь его, как хочешь (в том числе HTML, в который можно вставить картинку) Код: tablewidget->setCellWidget(row, column, lab); Название: Re: QTableWidgetItem Отправлено: Dr.robot от Январь 18, 2017, 12:39 А роль как задать?
Название: Re: QTableWidgetItem Отправлено: Day от Январь 18, 2017, 13:07 А роль как задать? Не знаю, не пробовал. Имхо, если ты помещаешь в ячейку виджет, то никакие роли уже не нужны. Впрочем, можешь сам поэкспериментировать, а нам потом расскажешь. Как я понимаю, вопрос в том, будет ли виджет в ячейке итемом, и будут ли работать для этой ячейке итемовские методы.Но если упрешься в стенку, у тебя всегда в запасе ход - Использовать QTableView с делегатами. Название: Re: QTableWidgetItem Отправлено: Dr.robot от Январь 18, 2017, 13:17 Ну если по честному то я уже делал вот так, создавал свой TableWidgetItem
Код И вставлял во так Код
Меня все устраивало но мне потребовалось сохранить таблицу а для этого мне нужно роль определить. Вот я и уперся в стенку, с делегатами не работал и не знаю что это такое. Название: Re: QTableWidgetItem Отправлено: Dr.robot от Январь 18, 2017, 13:26 Получается QIcon можно задать роль а QPixmap нет
Название: Re: QTableWidgetItem Отправлено: Day от Январь 18, 2017, 13:32 Цитировать с делегатами не работал Все равно когда-нибудь придется..:)Название: Re: QTableWidgetItem Отправлено: Dr.robot от Январь 18, 2017, 13:43 А есть какая нибудь литература с примерами желательно на питон?
Название: Re: QTableWidgetItem Отправлено: Day от Январь 18, 2017, 13:49 На Qt М.Саммерфилд "Профессиональное программирование" с воином на обложке.
Про питон не знаю Название: Re: QTableWidgetItem Отправлено: GreatSnake от Январь 18, 2017, 14:22 Получается QIcon можно задать роль а QPixmap нет С чего это ???В модели всё равно хранится для DecorationRole QPixmap. Меня все устраивало но мне потребовалось сохранить таблицу а для этого мне нужно роль определить. Widget устанавливается во view, а роль задаётся в модели через QAbstractItemModel::setData(...).Название: Re: QTableWidgetItem Отправлено: Dr.robot от Январь 18, 2017, 15:06 Widget устанавливается во view, а роль задаётся в модели через QAbstractItemModel::setData(...). Есть пример где это реализовано?, неужели никто картинки в таблицу не вставляет? =) Я имею ввиду просто вставить картинку с DecorationRole не иконку.Название: Re: QTableWidgetItem Отправлено: gil9red от Январь 18, 2017, 15:15 Widget устанавливается во view, а роль задаётся в модели через QAbstractItemModel::setData(...). Есть пример где это реализовано?, неужели никто картинки в таблицу не вставляет? =) Я имею ввиду просто вставить картинку с DecorationRole не иконку.Типа такого? ;D (https://github.com/gil9red/combustion/raw/master/INFO/screenshot_2.png) Название: Re: QTableWidgetItem Отправлено: Dr.robot от Январь 18, 2017, 15:24 Типа такого? ;D Вам смешно а я уже очень много времени потратил на это)))) Очень много информации на C++ но на питон очень мало. (http://s019.radikal.ru/i604/1701/77/26f00c3bb563.png) (http://radikal.ru) Вот что у меня если я просто использую Pixmap Название: Re: QTableWidgetItem Отправлено: gil9red от Январь 18, 2017, 16:11 Так ведь на с++ и питоне один и тот же Qt
самое большое различие -- способ коннекта, остальное -- различие языков, если вы пользуетесь IDE PyCharm, то вам проще писать код Попробуйте найти пример делегата на с++ и просто перепишите код на питон. Можете тут вопросы задавать, на питоне я вот уже почти 3 года что-нибудь для себя пишу смогу подсказать Название: Re: QTableWidgetItem Отправлено: gil9red от Январь 20, 2017, 13:36 Набросал я простенький пример (https://github.com/gil9red/SimplePyScripts/tree/master/image%20on%20whole%20cell%20in%20QTableWidget)использования делегата для отрисовки.
Ну и весь код: Код
Выглядит вот так (первый столбец обычный, остальные имеют делегаты): (https://github.com/gil9red/SimplePyScripts/raw/master/image%20on%20whole%20cell%20in%20QTableWidget/screenshot.png) Название: Re: QTableWidgetItem Отправлено: Dr.robot от Январь 20, 2017, 16:14 Ого спасибо буду разбираться (жаль сегодня, завтра не могу), еще раз спасибо!
Если что не пойму или будут вопросы отпишусь. Название: Re: QTableWidgetItem Отправлено: Пантер от Январь 20, 2017, 16:21 gil9red, если есть время, закинь, пожалуйста, этот пример в раздел http://www.prog.org.ru/board_61_0.html
Думаю, полезно будет. Название: Re: QTableWidgetItem Отправлено: Dr.robot от Январь 22, 2017, 15:26 Все работает хорошо спасибо.
Только не работает выделение ячейки по щелчку мыши(ну это мелочи). Хотя выдает ошибку, img = img.scaled(w, h, Qt.KeepAspectRatio, Qt.SmoothTransformation) AttributeError: 'NoneType' object has no attribute 'scaled' Название: Re: QTableWidgetItem Отправлено: gil9red от Январь 22, 2017, 19:42 Все работает хорошо спасибо. Только не работает выделение ячейки по щелчку мыши(ну это мелочи). Хотя выдает ошибку, img = img.scaled(w, h, Qt.KeepAspectRatio, Qt.SmoothTransformation) AttributeError: 'NoneType' object has no attribute 'scaled' Если вы код не меняли все будет работать :) img берется из Qt.DecorationRole: Код
Если делегат используется для ячеек без картинки в Qt.DecorationRole, то нужно тогда в делегат добавить проверку на наличие значения в img, например если img is None, тогда вызываем родительский метод отрисовки super().paint(painter, option, index) и выходим из функции рисования Название: Re: QTableWidgetItem Отправлено: Dr.robot от Январь 22, 2017, 21:03 Изначально пустые ячейки
Сделал примерно как ты сказал Код Уже меньше ругается :) Пишет QPainter::end: Painter ended with 380 saved states Название: Re: QTableWidgetItem Отправлено: gil9red от Январь 22, 2017, 23:24 Изначально пустые ячейки Сделал примерно как ты сказал Код Уже меньше ругается :) Пишет QPainter::end: Painter ended with 380 saved states Я бы сделал так: Код
Обновил тот код и сообщение с примером (http://www.prog.org.ru/index.php?topic=30916.msg228998#msg228998) Название: Re: QTableWidgetItem Отправлено: Dr.robot от Январь 23, 2017, 01:00 Вот теперь все работает без ошибок и даже выделение работает!
Собственно и точка. Спасибо огромнейшее! |