Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 25, 2009 03:35:03

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

QHeaderView

Что-то я запортачился…
Есть QTreeView, к которому подключается модель.
С модели, из headerData по DecorationRole передаётся QIcon с png из ресурса, размером 29x23. Всё бы хорошо, но мне надо отрисовать в колонке хедера эту иконку так, чтобы она была не 16x16, а полная. Если точнее, мне вообще надо сделать так, чтобы эта иконка была единственным описанием в этой узкой колонке… Ну типа красиво.

Само собой первая мысль:
view.header().setIconSize(QtCore.QSize(29, 23))
И, как вы уже догадались, мысль неправильная.
Пробовал изменять SizeHintRole в модели – хедер растёт, а иконка нет.

Последнее, что осталось, это перерисовать хедер руками… Но это идиотизм.
Может кто знает?



Офлайн

#2 Апрель 28, 2009 13:05:31

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

QHeaderView

Если кому интересно… Без плясок с бубном проблема не решилась.

class mapHeader(QtGui.QHeaderView):
def paintSection(self, painter, rect, index):
if index in [0, 1, 2, 4, 5]:
px = QtGui.QPixmap(rect.size())
pt = QtGui.QPainter(px)
QtGui.QHeaderView.paintSection(self, pt,
QtCore.QRect(0, 0,
rect.width(),
rect.height()),
-2) # пустой индекс
pt.end()
painter.drawPixmap(rect.x(), rect.y(), px)

icon = QtGui.QIcon(self.model().headerData(index,
QtCore.Qt.Horizontal,
QtCore.Qt.DecorationRole))

painter.drawPixmap(rect.x()+1, rect.y()+1, icon.pixmap(29, 23))
else:
QtGui.QHeaderView.paintSection(self, painter, rect, index)
Дело в том, что после QtGui.QHeaderView.paintSection(self, painter, rect, index) что-либо ещё дотисовывать пейнтер отказывался. Поэтому я создал новый пиксмап, который сначала заполнил пустым хедером, потом нарисовал его на нужном месте, и сверху отрисовал иконку.
А вообще как-то оно всё глючно и нелогично работает.



Офлайн

#3 Апрель 28, 2009 20:06:24

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

QHeaderView

В исходниках С++ не копался? PyQt много чего скрывает, прям как чёрный ящик иногда, очевидные вещи делаются через ж… т.е. через workaround. Думаю давно пора изучать исходники и если что делать багрепорты троллям. Просто пока тупиковых случаев не встречал…



Офлайн

#4 Апрель 29, 2009 00:29:07

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

QHeaderView

Да уж… Иногда задумываюсь, что архитектура PyQt уже хорошо устарела… Этот SIP… Блин, надо же такое придумать! Так что, ИМХО, багреторты надо не троллям слать, а ривербанковцу… :-) Построить бы свой Лунный Модуль!..
Но в общем ты прав, окончательно тупиковых ситуаций я не встречал… Но магии много. И бубна.

P.S. Вот сейчас думаю, удастся ли без бубна отрисовать иконку в ячейку этого TreeView… Также, на всю ячейку. :-)



Офлайн

#5 Апрель 29, 2009 07:50:33

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

QHeaderView

Копался в истории, нашел разработку 2005-го кода: python-qt4 - вручную написанные биндинги с помощью boost::pyhton тех лет (уже новая версия появилась), код держать в актуальном состоянии не возмжно и покрыть вручника весь кьют также не возможно… заглох проект.
Я уже думал насчёт своего “Лунного Модуля”, всё для этого вроде есть: (boost::python or cython or (boost::python and Py++)) and pygccxml and gccxml. Странно что никакой альтернативы PyQt до сих пор не появилось:(
И как я понял, ривербанковец включать лицензию LGPL не будет точно, это его бизнес, а жаль… всё зависит от одного человека можно сказать.



Отредактировано (Апрель 29, 2009 07:54:31)

Офлайн

#6 Апрель 29, 2009 14:06:58

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

QHeaderView

poltergeist
Странно что никакой альтернативы PyQt до сих пор не появилось :-(
И не появится. PyQt всем, в общем-то, хвавает. А браться за написание этих биндингов, а потом за их поддержку… Это будет очень не просто. Невольно задумаешься над коммерцелизацией. Вот если бы на базе какой-нить компании… Типа рядом с основным проектом, под предлогом независимости… Но в итоге дешевле купить PyQt.

poltergeist
И как я понял, ривербанковец включать лицензию LGPL не будет точно, это его бизнес, а жаль… всё зависит от одного человека можно сказать.
Не собирается. Да и, в общем-то, правильно делает – кушать-то все хотят.

Добавленно:
Сейчас в голову пришла мысль, что если такое написать, а потом прилипить к KDE (а им понравится мысль об избавлении от лицензии PyQt), то можно попасть под их крылышко… А это уже хоть не сильно, но не бесплатно. На пиво хватит, значит и поработать можно. :-)

И ещё добавленно::
А теперь в голову вообще караул что пришло… Надо парсить не код Qt, а документацию! В ней всё есть и притом во вполне читаемом виде.
В итоге надо будет только описать совмещение с питониими типами (ну там листы-словари всякие) и тесты… Сигналы нормальные…



Отредактировано (Апрель 29, 2009 14:48:37)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version