PyQt: Как передавать текстовые данные между виджетами? - PullRequest
1 голос
/ 20 ноября 2011

Так вот моя проблема. Я приложил изображение того, с чем я работаю, чтобы дать вам некоторое представление о том, что я делаю. У меня есть список значков внизу. У меня есть QGraphicsView над ним (с линией, проходящей через него).

http://oi43.tinypic.com/2uhx1xj.jpg (очевидно, я пока не могу публиковать изображения, потому что я новичок)

Пока я могу перетащить значок из нижнего списка в QGraphicsView. Тем не менее, изображение, которое было добавлено в QGraphicsView, является всего лишь одним изображением по умолчанию, которое я определил как значок "blender". (Код ниже - это то, что я работаю с 1 изображением по умолчанию).

#Defined in QGraphicScene
def dropEvent(self, event):
    event.accept()
    item = QGraphicsPixmapItem(QPixmap("images/{}".format("blender")))
    item.setFlags(QGraphicsItem.ItemIsSelectable|
                  QGraphicsItem.ItemIsMovable)

    position = QPointF(event.scenePos())
    print(position)
    item.setPos(position)
    self.addItem(item)

То, что я ХОЧУ, это изображение, которое помещается в QGraphicsView, чтобы быть тем же изображением, что и в QListWidget. Например, если «Mozilla» перетаскивают в QGraphicsView, я хочу, чтобы отображался значок Mozilla, и т. Д. Я думаю, что если я каким-то образом смогу передать текстовое имя из QListWidget в QGraphicsView, я мог бы просто заменить » блендер "с любой переменной.

То, что я должен сделать, - это переопределить функцию «startDrag ()» для моего QListWidget, а затем в моем QGraphicsScene мне нужно реализовать свой dropEvent () для обработки этих данных. Я просмотрел QMimeData & QDataStream, но не совсем ясно. Я думаю, это выглядит примерно так:

#startDrag() that is reimplemented for the listWidget1 function. listWidget1 is the list in the first tab
def scene_startDrag(self, dropActions):
    item = self.listWidget1.selectedItems()
    data = QByteArray()
    stream = QDataStream(data, QIODevice.WriteOnly)
    stream.writeQString(item.text())
    mimeData = QMimeData()
    mimeData.setData("application/x-img", data)
    drag = QDrag(self)
    drag.setMimeData(mimeData)

Если это поможет, у меня все эти значки в listWidget1 хранятся в словаре, называемом «узлы», ключом которого является любое имя, отображаемое в списке. Таким образом, в listWidget1 ключ Mozilla - просто «mozilla».

Проще говоря, все, что я хочу сделать, - это получить правильное изображение для отображения в QGraphicsView. Простите за длинный пост. У кого-нибудь есть идеи о том, как я могу это реализовать? Спасибо за любой вклад!

1 Ответ

2 голосов
/ 20 ноября 2011

Ну, я не думал, что получу это, но я понял это. После более подробного изучения функций перетаскивания я получил кое-что, что работает. QMimeData сбивает с толку.

Вот что я сделал. Сначала заново реализовали startDrag() для виджета списка:

def scene_startDrag(self, dropActions):
    item = self.listWidget1.currentItem()
    data = QByteArray()
    stream = QDataStream(data, QIODevice.WriteOnly)
    stream.writeQString(item.text())
    mimeData = QMimeData()
    mimeData.setData("application/x-imgname", data)
    drag = QDrag(self)
    drag.setMimeData(mimeData)
    drag.exec() #actually starts the dragging

Затем в QGraphicsScene, связанном с QGraphicsView, я переопределил функцию dropEvent():

def dropEvent(self, event):
    if(event.mimeData().hasFormat("application/x-imgname")):
        event.accept()
        data = event.mimeData().data("application/x-imgname")
        stream = QDataStream(data, QIODevice.ReadOnly)
        text = stream.readQString()
        item = QGraphicsPixmapItem(QPixmap("images/{}".format(text)))
        item.setFlags(QGraphicsItem.ItemIsSelectable|
                      QGraphicsItem.ItemIsMovable)
        position = QPointF(event.scenePos())
        item.setPos(position)
        self.addItem(item)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...