Найти - Пользователи
Полная версия: PyQt4: поворот и drag-and-drop картинок
Начало » GUI » PyQt4: поворот и drag-and-drop картинок
1 2 3 4 5 6 7
The gray Cardinal
Попробую немного уточнить свои намерения. Мне нужен не просто поворот картинки (как уже описано в самом первом посте), а ещё и частичное наложение картинок друг на друга. При этом “поле” картинки (в данном случае объект QGraphicsView) должно быть также повёрнуто, чтобы при повороте прямоугольной картинки это поле не было вынуждено “разрастаться” в ширину, что происходит, если оно остаётся ориентированным по-прежнему вертикально. Попросту говоря, мне нужно отрисовать игральные карты “веером” :). Чтобы пояснить свою мысль, привожу маленький скрипт (пригоден для запуска):
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui

class MainWindow(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)

pixmap = QtGui.QPixmap(u'011.jpg')
self.scene = QtGui.QGraphicsScene()
self.scene.addPixmap(pixmap)
view = QtGui.QGraphicsView(self.scene, self)
view.rotate(-20)

pixmap2 = QtGui.QPixmap(u'012.jpg')
self.scene2 = QtGui.QGraphicsScene()
self.scene2.addPixmap(pixmap2)
view2 = QtGui.QGraphicsView(self.scene2, self)

pixmap3 = QtGui.QPixmap(u'013.jpg')
self.scene3 = QtGui.QGraphicsScene()
self.scene3.addPixmap(pixmap3)
view3 = QtGui.QGraphicsView(self.scene3, self)
view3.rotate(20)

view.setGeometry(0, 0, 250, 300)
view2.setGeometry(100, 00, 163, 320)
view3.setGeometry(170, 20, 250, 300)

if __name__=="__main__":
app = QtGui.QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())
Рядом со скриптом должны находиться три картинки, которые вы можете закачать здесь:
http://stream.ifolder.ru/9322446 (16 Кб)
Глядя на этот скрипт, возникает вопрос: а какие вообще технологии мне нужны? Подходят ли мне для этой задачи все эти QPixmap, QGraphicsScene и QGraphicsView? Закрадывается мысль, что не подходят. Может, нужно смотреть в сторону OpenGL?
Очень прошу квалифицированного совета.
gmorgunov
Привет.
Похоже, надо использовать paintEvent(). Я с этим сталкивался. Проверить не могу( авария с инетом).
Нашел похожий пример( использование paintEvent() ). Восстановлюсь - отпишу. :)
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class MyWidget(QWidget):
def __init__(self,*args):
QWidget. __init__ (self,*args)
def paintEvent(self, event=None):
painter = QPainter(self)
image = QImage("/home/mike/Desktop/lena.jpg")
painter.drawImage(0,0, image)

app = QApplication(sys.argv)
widget = MyWidget()
widget.resize(500,500)

widget.show()
sys.exit(app.exec_())
The gray Cardinal
Ещё, был бы признателен за простейший пример с drag-and-drop картинок в пределах окна программы.
Ну, например, сделать в окне два “посадочных места”, между которыми перетаскивать мышкой одну картинку.

Добавлено позже:
Эта просьба снимается, т.к. пример examples\draganddrop\draggableicons\draggableicons.pyw действительно вполне доступен (извиняюсь, я как-то сразу не проникся).
The gray Cardinal
Отыскал способ, как поворачивать картинки с помощью Qlabel и QPixmap/QMatrix. Примерно так:
pic = QtGui.QPixmap('012.jpg')
pic = pic.transformed(QtGui.QMatrix().rotate(20))
icon2 = QtGui.QLabel(self)
icon2.setPixmap(pic)
Однако, это всё ещё не то, чего мне хотелось бы. Пока не знаю, как приспособить такой поворот для drag-and-drop. Дело в том, что метка повёрнутой таким способом картинки занимает слишком много места (т.к. метка всегда остаётся прямоугольной и всегда ориентирована одинаково “вертикально”). В результате при частичном наложении таких картинок получается сильная “некрасота” - при использовании drag-and-drop пользователь может начать перетаскивать совсем не ту картинку, за которую он пытается “ухватиться”. Иллюстрация - небольшое видео (порядка 1Мб). Кроме того, при многократном вызове “rotate” картинка сильно портится (снижается качество изображения). Таким образом, вопрос:
…а какие вообще технологии мне нужны? Подходят ли мне для этой задачи все эти QPixmap, QGraphicsScene и QGraphicsView? Закрадывается мысль, что не подходят. Может, нужно смотреть в сторону OpenGL?
пока всё ещё актуален.
igor.kaist
У меня с этим PIL замечательно справляется :)
The gray Cardinal
igor.kaist
У меня с этим PIL замечательно справляется
А есть ссылочка с демонстрацией результата?
igor.kaist
Поворот изображений то? А что демонстрировать то?
out = im.rotate(45) # degrees counter-clockwise
The gray Cardinal
Кроме того, при многократном вызове “rotate” картинка сильно портится (снижается качество изображения). Таким образом, вопрос:
…а какие вообще технологии мне нужны? Подходят ли мне для этой задачи все эти QPixmap, QGraphicsScene и QGraphicsView? Закрадывается мысль, что не подходят. Может, нужно смотреть в сторону OpenGL?
Зачем OpenGL юзать для простой операции, как поворот картинок? Или я чего то недопонимаю…
The gray Cardinal
igor.kaist
А что демонстрировать то?
Drag-and-drop повёрнутых изображений, проблема именно в этом. Коряво это получается, и я не пойму, почему: то ли я не доделал что-то, то ли действительно это нормально этими инструментами реализовать нельзя. Если у тебя нормальный инет, глянь видео выше (в #14 посте), может, так понятнее будет, в чём моя проблема.
igor.kaist
Все понял. То есть область, в которой находится повернутая картинка, все равно остается прямоугольной и при drag'е цепляется не та картинка…
Может попробывать “вручную” определять, за какую картинку цепляемся мышкой? То есть зная угол и положении картинок, по положению курсора определять, какая картинка попала под курсор мышки?
gmorgunov
igor.kaist
Зачем OpenGL юзать для простой операции, как поворот картинок? Или я чего то недопонимаю…
Да,похоже, что использование PyQt для простых операций - не лучший выбор.Слишком все завязано.Но пока сам во всем не убедишься - не поверишь. Работы - на рубль, результат на копейку.Конечно, я еще буду пробовать PyQt, но уже зародились серьезные сомнения в целесообразности ее использования для простых задач.

The Gray Cardinal
-Пробовал dragableicons.py во всех вариантах - у картинки при многократном нажатии появляется зернистость.
-Пробовал рисовать на QLabel - плохо.
-QGraphicsView - не поддерживает размещение кнопок, чтобы попытаться сделать 2 окна, в одном увеличивать/уменьшать, в другом показывать( или я не нашел метода).
-paintEvent() - рисует всегда и везде, в общем тоже не подходит.
Нашел единственный стоящий пример из всех - puzzles.py.В нем имеет смысл разобраться(имхо).
А так вариант, который я приводил выше(QGraphicsView) - лучший. Я к нему еще добавил scale().
Моя оценка - 3++ :)
Буду еще копать.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB