Чтобы добавлять сообщения и комментарии, .

@matrixdaniil:
matrixdaniil

Поставил pyqt сижу балуюсь. Вроде удобная и довольно простая штука.

@Fangel:
Fangel

_Вредные советы_
Вредный совет про самый простой способ изменения размеров графических элементов с помощью точек.
Сам класс точки, без изменений.
class node(QtGui.QGraphicsItem):
	def __init__(self, parent = None, scene = None):
		QtGui.QGraphicsItem.__init__(self, parent = None, scene = None)
		self.setFlag(QtGui.QGraphicsItem.ItemIsMovable)
		self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable)
		self.setZValue(-1)
		
	def boundingRect(self):
		return QtCore.QRectF(-5, -5, 10, 10)
		
	def shape(self):
		path=QtGui.QPainterPath()
		path.addEllipse(-5, -5, 10, 10)
		return path
		
	def paint(self, painter, option, widget = None):
		painter.setPen(Qt.Qt.NoPen)
		painter.setBrush(Qt.Qt.darkGreen)
		painter.drawEllipse(-5, -5, 10, 10)
		
	def type(self):
		return 65540
		
	def mousePressEvent(self, event):
		self.parentItem().color = QtGui.QColor(255,255,255,160)
		self.update()
		QtGui.QGraphicsItem.mousePressEvent(self, event)
		
	def mouseMoveEvent(self, event):
		self.parentItem().retMoved(self.pos(),self)		
		self.update()
		QtGui.QGraphicsItem.mouseMoveEvent(self, event)
		
	def mouseReleaseEvent(self, event):
		self.parentItem().color = QtGui.QColor(255,255,255,40)
		self.update()
		QtGui.QGraphicsItem.mouseReleaseEvent(self, event)

Теперь можно разместить эти точки в ините класса нашего элемента, который мы собрались изменять.
Добавляем в наш изменяемый элемент подобный метод
def retMoved(self,pos,node):
		if node == self.baloonNode1:
			self.w = self.w + self.x - pos.x()
			self.h = self.h + self.y - pos.y()
			self.x=pos.x()
			self.y=pos.y()
		if node == self.baloonNode2:
			sceneW = self.w + self.x
			sceneH = self.h + self.y
			self.w=self.w - sceneW  + pos.x()
			self.h=self.h - sceneH  + pos.y()
		self.update()
Тут у меня две точки. Этого хватает для изменения большинства элементов. Первая точка слева вверху, вторая справа внизу. Важно чтоб границы были динамические, и еще рендер мне пришлось поставить на обновление полной сцены, ибо куда-то временами все исчезало.
С функциями mapFrom* mapTo* я не разобрался, почему-то все валилось в координатах сцены. С координатами вообще темный лес. Например ноды я рисовал в локальных координатах, а изменяемый элемент в координатах сцены, причем явно я ничего не указывал.
Вобщем эту часть я в примерах нигде не нашел. Решил записать тут, ибо как новичку, мне очень сложно было вкурить в то, как связать два элемента графических между собой.

@Fangel:
Fangel

_Вредные советы_
Изучаю QT4, вот понадобилось создать динамическое меню. Мною допиленное чужое решение на сях.
def addButton(self,listing):
 menu=QtGui.QMenu()
 menus=[]
 n, count=0, 0
 menus.append(menu.addMenu(str(1+count)+" - "+str(count+20)))
 for i in listing:
  itemAct= QtGui.QAction(i, self)
  itemAct.triggered.connect(self.createTable)
  menus[-1].addAction(itemAct)
  n += 1
  if n == 20:
   n = 0
   menus.append(menu.addMenu(str(1+count)+" - "+str(count+20)))
  count += 1
  self.button.setMenu(menu)

self.button - обычная кнопка
listing - массив названий, из которых создается меню

def createTable(self):
 data=unicode(self.sender().text())
 self.labelName.setText(data)
 list_itm = main.bas.select(data)
 header=main.bas.getHeader(data)
 self.table.setmydata(list_itm,header)

Первая строчка этого метода позволяет нам узнать откуда все же пришел сигнал. Собсно главная героиня вредного совета. 
Если известен менее костыльнутый способ узнать отправителя сигнала (особенно интересует для кнопок), буду рад услышать, даже на сях (с них и передалываю).

@Fangel:
Fangel

Сделал Два проекта с одинаковым функционалом на pygtk и pyqt4. Делал ради сравнения. Итак впечатления.
Начал я с pyqt4. По началу вроде все просто было, сразу нашел учебник, вник, порадовался что кода меньше писать. Но, как бывает, пришел облом. Когда пришлось передать данные от кнопки в функцию. По сути узнать какая кнопка из динамически созданных была нажата. Это дело решилось после суток сидения над сишной документацией и доставания знакомого, который немного знаком с Qt, он предложил сишный вариант, я его переделал с учетом нюансов. Словом документация pyqt4 оставляет желать лучшего, даже англоязычная. Хороших примеров тоже не много. Еще одно неудобство, это приведение типов данных в кутишные. Нафиг троллтеховцы напрудили своих типов...
Вторым начал проект на pygtk. Открыл туториал, проникся. За 6 часов проект был закончен. Писать пришлось больше. Конечный код вышел на 50 строк больше, чем в qt (200 строк). Оно и понятно, там где в кути две строки, в gtk из 3 или 4. В проекте присутствовала таблица. В pygtk такого виджета, как таблица, нет. Пришлось ваять по примеру, найденому в тырнетах. Данные от кнопок передаются без костылей, что порадовало после Qt.
В обоих проектах я не познал мастерства компоновки виджетов. Знаю что сейчас модно пользоваться дизайнерами, но на дизайнеры я бы потратил еще по дню, а мне лень))
Выводы. gtk хорош обилием документации, что очень облегчает вникание. Но думаю, если вникнуть в Qt, то он окажется не сложнее. Наработанные навыки костыляния pyQt и меньшее количество писания кода могут оказаться плюсом, против gtk.
Еще осталось gtk3, его я не смотрел.

@Fangel:
Fangel

Черт, на PyQt инфы на русском так же мало как и на PyGTK. Хотя PyQT проще в создании гуя чем PyGTK, хотя возможно это просто нехватка хороших примеров с описанием. На оба фреймворка нет хороших примеров с русскими каментами. На PyQT наткнулся на примерчик организации гуевой проги saltycrane.com и я кажется понял принцип организации кода в гуе, мне это раньше не давалось... Подобное было с пониманием классов. Как же не хватает нормального объяснения... Почему нужно набивать собственные шишки?

@Skyrzn:
Skyrzn

Надоело каждый раз преобразовывать QString в str (с str мне работать удобнее). Для этого приходится делать что-то типа:
str(self._usernameEdit.text().toUtf8()).
Эта проблема решается одной строкой:
QString.toStr = lambda self: str(self.toUtf8())
, которую надо выполнить один раз где-нибудь в начале программы.
В дальнейшем преобразовывание выглядит так:
self._usernameEdit.text().toStr()
Python рулит! :)

@ygarris:
ygarris

popdevelop.com

@Transmitter:
Transmitter

начал изучение Qt посредством PyQt. полёт нормальный. к концу следующей недели надеюсь более-менее освоиться.

@soulless:
soulless

Какой вариант красивее, логичнее, удобнее, "правильнее", приятнее, (свой вариант)

self.connect(self.button, SIGNAL("clicked()"), self.clickOn)
или
self.button.clicked.connect(self.clickOn)

Зы. Оба варианта рабочие и делают одно и то же.

@kekssw:
kekssw

касательно упомянутого в #611859 улучшения. кратко, суть в том, что заменили прямой байндинг из плюсовогого кьюти:
QObject.connect(self.pushbutton, QtCore.SIGNAL("clicked()"), self.button_pushed)
"гораздо более питоничным":
self.pushbutton.clicked.connect(self.button_pushed)
может мне кто-нибудь объяснить почему вместо всех этих connect и emit не писать просто:
self.button.clicked += self.button.pushed
и
self.button.clicked()
?
вот так — на самом деле питоничнее было бы (сначала казалось лучше декораторами, но я так понимаю там трудности с множественностью использования как слотов, так и сигналов + порядок вызова/определения не известен заранее). казалось бы реализация занимает 3 десятка строк, а синтаксис (в тысячах случаев) упрощается сильно.

@viknet:
viknet

всё, система разработки под Python и Qt установлена, настроена и даже выдаёт рабочие программы. завтра пойду на штурм питона. а пока что спать, ибо предыдущая ночь выдалась бессонной :)

@viknet:
viknet

ну неужели… указал везде где только можно архитектуру i386 и оно начало собираться. слава айтишным богам, горе нокии, 64 бита неподдерживающей.

@viknet:
viknet

ура! моя первая простенькая программка на python запустилась и работает! :) сразу с PyQt :)
правда под линуксом :(

@viknet:
viknet

ну что за фигня :( PyQt не собирается на SnowLeopard :( ругается, что собирают её под 64 бита, а Qt — 32. и на сайте 64-битной сборки нет и не пойму, как его собирать под 32 бита