【问题标题】:QGraphicsView Drag&Drop issueQGraphicsView拖放问题
【发布时间】:2015-08-29 09:40:55
【问题描述】:

我对 PyQt4 GraphicsView 有疑问。我想使用从列表视图拖放到图形场景/视图中,并将项目准确地放置在鼠标光标的位置。

from PyQt4 import QtCore, QtGui
import sys

class GraphicsScene(QtGui.QGraphicsScene):

    def __init__(self, parent = None):
        super(GraphicsScene, self).__init__(parent)

    def dragEnterEvent(self, event):
        event.accept()

    def dragMoveEvent(self, event):
        event.accept()

    def dragLeaveEvent(self, event):
        event.accept()

    def dropEvent(self, event):
        text = QtGui.QGraphicsTextItem(event.mimeData().text())
        text.setPos(event.scenePos())
        self.addItem(text)
        event.accept()

class ListView(QtGui.QListView):

    def __init__(self, parent = None):
        super(ListView, self).__init__(parent)
        self.setDragEnabled(True)

    def dragEnterEvent(self, event):
        event.setDropAction(QtCore.Qt.MoveAction)
        event.accept()

    def startDrag(self, event):
        index = self.indexAt(event.pos())
        if not index.isValid():
            return

        selected = self.model().data(index, QtCore.Qt.DisplayRole)

        mimeData = QtCore.QMimeData()
        mimeData.setText(selected.toString())

        drag = QtGui.QDrag(self)
        drag.setMimeData(mimeData)

        result = drag.start(QtCore.Qt.MoveAction)
        if result: # == QtCore.Qt.MoveAction:
            pass

    def mouseMoveEvent(self, event):
        self.startDrag(event)

class MainWindow(QtGui.QMainWindow):

    def __init__(self, parent = None):
        super(MainWindow, self).__init__(parent)

        self.setGeometry(100, 100, 400, 400)

        self.widget = QtGui.QWidget()
        self.setCentralWidget(self.widget)
        layout = QtGui.QGridLayout(self.widget)

        self.ListView = ListView()

        data = QtCore.QStringList()
        data << "one" << "two" << "three"
        self.model = QtGui.QStringListModel(data)

        self.ListView.setModel(self.model)

        self.GraphicsView = QtGui.QGraphicsView()
        self.scene = GraphicsScene()
        self.GraphicsView.setScene(self.scene)

        layout.addWidget(self.ListView, 0, 0, 5, 5)
        layout.addWidget(self.GraphicsView, 0, 1, 5, 5)

        self.show()

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec_())

删除第一个项目时出现问题。它直接进入视图中心,但我希望它保持在光标位置。有什么想法吗?

【问题讨论】:

    标签: python qt pyqt


    【解决方案1】:

    看来您需要先设置 QGraphicsView 的 rect 才能正确初始化它。然后添加的第一个项目将按预期工作。

    self.GraphicsView.setSceneRect(0, 0, self.GraphicsView.width(), self.GraphicsView.height())
    

    这需要在 show 事件之后添加,因为调用 QGraphicsView 的宽度和高度会事先抛出错误的值。

    【讨论】:

    • 像魅力一样工作!谢谢
    猜你喜欢
    • 1970-01-01
    • 2018-03-09
    • 2012-02-02
    • 2011-06-27
    • 2023-04-10
    • 2015-08-27
    • 2013-10-19
    相关资源
    最近更新 更多