PyQt:如何在小部件之间传输文本数据?

时间:2011-11-20 07:24:15

标签: python pyqt

所以这是我的问题。我附上了一份我正在使用的图片,让你对我正在做的事情有一些视觉概念。我在底部有我的图标列表。我上面有一个QGraphicsView(通过它的线)。

http://oi43.tinypic.com/2uhx1xj.jpg(显然我还不能发布图片,因为我是新手)

到目前为止,我可以将图标从底部列表拖放到QGraphicsView中。但是,放入QGraphicsView的图像只是我定义为“blender”图标的1个默认图像。 (下面的代码是我使用的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,那么我可以直接替换“搅拌器“无论变量如何。

我认为我要做的是重新定义我的QListWidget的“startDrag()”函数,然后在我的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中的所有图标存储在名为“nodes”的字典中,其中的键是列表中显示的名称。所以在listWidget1中,Mozilla的关键只是“mozilla”。

简而言之,我想做的就是在QGraphicsView中显示正确的图像。对不起,很长的帖子。有没有人知道如何实现这个?感谢您的任何意见!

1 个答案:

答案 0 :(得分:2)

嗯,我没想到我会得到这个,但我明白了。在更广泛地阅读了拖放功能后,我得到了一些有用的东西。 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)