【问题标题】:Qt dragging item at scene position while movingQt在移动时在场景位置拖动项目
【发布时间】:2013-01-25 02:55:50
【问题描述】:

在场景周围拖动 qgraphicsitem 可以通过多种方式完成。但对我来说最有趣的是附加标志“itemIsMovable”,因为它应该更“原生”与 Qt 库。

我的问题是;当项目正在拖动时,应该以什么方式打印它的位置?请记住,我们已经标记,项目正在移动并且位置正在返回某处。

下面就是例子。问题是如何以交互方式更新矩形和圆形之间的连接线(使用工具栏图标添加带有连接线的圆形)。

import sys
from PySide import QtCore, QtGui

class drawCircle(QtGui.QGraphicsItem):
    def __init__(self, scene):
        self.Circle = QtGui.QGraphicsEllipseItem(-20, -20, 40, 40)
        self.Circle.setPos(50,50)
        self.Circle.setFlag(QtGui.QGraphicsItem.ItemIsMovable)
        scene.addItem(self.Circle)

        self.Line = QtGui.QGraphicsLineItem(-20, -20, 40, 40)
        self.Line.setLine(0, 0, self.Circle.pos().x(), self.Circle.pos().y())
        scene.addItem(self.Line)

class winScene(QtGui.QGraphicsScene):
    def __init__(self):
        super(winScene, self).__init__()
        self.setSceneRect(0,0,450,200)
        self.addItem(QtGui.QGraphicsRectItem(-20, -20, 40, 40))

class SceneWindow(QtGui.QMainWindow):
    def __init__(self):
        super(SceneWindow, self).__init__()
        self.DefineSceneWindow()

    def DefineSceneWindow(self):
        self.SchSc = winScene()
        view = QtGui.QGraphicsView(self.SchSc)
        view.setRenderHint(QtGui.QPainter.Antialiasing)
        view.scale(1,1)
        self.setCentralWidget(view)
        self.setGeometry(0, 300, 500, 300)
        self.show()

        self.drRect = QtGui.QAction(QtGui.QIcon('paint_brush.png'), 'Draw Circle', self)
        self.drRect.setShortcut('Ctrl+R')
        self.drRect.triggered.connect(self.DefineAction)

        self.toolbar = self.addToolBar('tools')
        self.toolbar.addAction(self.drRect)

    def DefineAction(self):
        drawCircle(self.SchSc)

def main():
    app = QtGui.QApplication(sys.argv)
    ex = SceneWindow()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

【问题讨论】:

    标签: qt events qt4 pyqt pyside


    【解决方案1】:

    您需要重新实现QGraphicsItem.itemChange(change, value) 来检测场景位置的变化。 PySide docs 有一个直接相关的例子。

    【讨论】:

    • 那么,拖拽项目的成本更低的方式应该是什么:这个带有标志的 ItemSendsScenePositionChanges 或通过 item.grabMouse 在场景事件 def 中交互附加(请记住,这应该是很多要求很高的项目和组)?
    • 来自QGraphicsItem::grabMouse() 文档:“几乎从不需要在Qt 中显式抓取鼠标”。使用我建议的场景位置更改通知。
    • @Alex SO 不是那种网站。最接近的等价物是在聊天中创建一个新房间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 2013-10-04
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    相关资源
    最近更新 更多