首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中创建拖放建模工具

在Python中创建拖放建模工具
EN

Stack Overflow用户
提问于 2017-05-04 15:42:24
回答 2查看 5.6K关注 0票数 4

我不知道该怎么问,但我要说了……

我想创建一个定义了大约10个不同对象的用户界面。

这些对象都可以相互连接。

有没有一个基于Python的工具,可以很容易地定义一个简单的用户界面和一个画布,其中包含一些可以拖动的对象。

例如。假设我有一个python框架来解决powerflow问题。我以编程的方式创建网络。

现在我只想定义一些对象,每个对象都有一个小图片,将它们拖到画布上,右键单击它们来设置它们的设置。

我可以研究所有普通的python东西,但只是检查一下thre是不是一个可以帮助实现自动化的工具。

我添加了一张商业工具的图片。托比

EN

回答 2

Stack Overflow用户

发布于 2017-05-04 15:53:40

它必须是原生UI吗?如果没有,我建议使用D3.js来实现可视化,使用python作为后端,使用AJAX进行通信。它将比使用PyQt或PyTk实现类似功能的效率高得多。

至于一些现成的套餐,我不知道是否有。

票数 4
EN

Stack Overflow用户

发布于 2017-05-10 20:15:41

为了完成您的任务,您需要将qtnode(https://github.com/cb109/qtnodes)模块与Pyqt拖放代码结合起来。下面的代码可能会对你有所帮助,但你需要阅读qtnode的内部代码。如果您可以折衷拖放选项,那么您将很容易仅使用qtnode构建应用程序。

您可以构建与Tobie相同的工具,但您需要使用pyside或pyqt或tkinter从头开始编写所有代码。

将下拉列表拖到图形场景中

代码语言:javascript
复制
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)
        #self.GraphicsView.setSceneRect(0, 0, self.GraphicsView.width(), self.GraphicsView.height())
        
        layout.addWidget(self.ListView, 0, 0, 5, 5)
        layout.addWidget(self.GraphicsView, 0, 1, 5, 5)

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

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

下面的代码用于拖放按钮

代码语言:javascript
复制
from PyQt4 import QtGui, QtCore

class DragButton(QtGui.QPushButton):

    def __init__(self, parent):
         super(DragButton,  self).__init__(parent)
         self.allowDrag = True
    
    def setAllowDrag(self, allowDrag):
        if type(allowDrag) == bool:
           self.allowDrag = allowDrag
        else:
            raise TypeError("You have to set a boolean type")
    
    def mouseMoveEvent(self, e):
        if e.buttons() != QtCore.Qt.RightButton:
            return
    
        if self.allowDrag == True:
            # write the relative cursor position to mime data
            mimeData = QtCore.QMimeData()
            # simple string with 'x,y'
            mimeData.setText('%d,%d' % (e.x(), e.y()))
            print mimeData.text()
    
            # let's make it fancy. we'll show a "ghost" of the button as we drag
            # grab the button to a pixmap
            pixmap = QtGui.QPixmap.grabWidget(self)
    
            # below makes the pixmap half transparent
            painter = QtGui.QPainter(pixmap)
            painter.setCompositionMode(painter.CompositionMode_DestinationIn)
            painter.fillRect(pixmap.rect(), QtGui.QColor(0, 0, 0, 127))
            painter.end()
    
            # make a QDrag
            drag = QtGui.QDrag(self)
            # put our MimeData
            drag.setMimeData(mimeData)
            # set its Pixmap
            drag.setPixmap(pixmap)
            # shift the Pixmap so that it coincides with the cursor position
            drag.setHotSpot(e.pos())
    
            # start the drag operation
            # exec_ will return the accepted action from dropEvent
            if drag.exec_(QtCore.Qt.LinkAction | QtCore.Qt.MoveAction) == QtCore.Qt.LinkAction:
                print 'linked'
            else:
                print 'moved'
    
    def mousePressEvent(self, e):
        QtGui.QPushButton.mousePressEvent(self, e)
        if e.button() == QtCore.Qt.LeftButton:
            print 'press'
            #AQUI DEBO IMPLEMENTAR EL MENU CONTEXTUAL
    
    def dragEnterEvent(self, e):
        e.accept()
    
    def dropEvent(self, e):
        # get the relative position from the mime data
        mime = e.mimeData().text()
        x, y = map(int, mime.split(','))
    
            # move
            # so move the dragged button (i.e. event.source())
        print e.pos()
            #e.source().move(e.pos()-QtCore.QPoint(x, y))
            # set the drop action as LinkAction
        e.setDropAction(QtCore.Qt.LinkAction)
        # tell the QDrag we accepted it
        e.accept()

我从堆栈上复制的所有代码都溢出了。请通过下面的链接了解更多详细信息。

Drag n Drop inside QgraphicsView doesn't work (PyQt)

Drag n Drop Button and Drop-down menu PyQt/Qt designer

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43776796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档