画面の背景画像の上にコントロールを表示できるようにする必要があります。私はすでにそのタスクを達成し、1 つのコントロール (画像を表示する QLabel) を作成して表示しました。ラベルを移動したい場所にドラッグするだけでラベルを移動できるようにする必要があります.pyqtでのドラッグに関するいくつかのチュートリアルに従いましたが、このタスクを達成できませんでした
これが私のコードです。コントロールは移動できますが、移動すると背景も移動し、ドロップすると同じ元の位置に留まることに注意してください。私が望むのは、コントロール (画像を表示する QLabel) のみを移動し、タブ内でドラッグするだけで移動することです:
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class CentralWidget(QFrame):
def __init__(self, *args):
super(CentralWidget, self).__init__(*args)
self.setStyleSheet("background-image: url(logo.png);")
self.setAcceptDrops(True)
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())
e.source().move(e.pos()-QPoint(x, y))
# set the drop action as Move
e.setDropAction(Qt.MoveAction)
# tell the QDrag we accepted it
e.accept()
class Selector(QLabel):
def mouseMoveEvent(self, e):
if e.buttons() != Qt.LeftButton:
return
# write the relative cursor position to mime data
mimeData = QMimeData()
# simple string with 'x,y'
mimeData.setText('%d,%d' % (e.x(), e.y()))
# let's make it fancy. we'll show a "ghost" of the button as we drag
# grab the button to a pixmap
pixmap = QPixmap.grabWidget(self)
# below makes the pixmap half transparent
painter = QPainter(pixmap)
painter.setCompositionMode(painter.CompositionMode_DestinationIn)
painter.fillRect(pixmap.rect(), QColor(0, 0, 0, 127))
painter.end()
# make a QDrag
drag = 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_(Qt.MoveAction) == Qt.MoveAction:
print 'moved'
# else:
# print 'copied'
def mousePressEvent(self, e):
QLabel.mousePressEvent(self,e)
if e.button() == Qt.LeftButton:
print 'press'
class fPrincipal(QMainWindow):
def __init__(self, parent=None):
# Call base class constructor
QMainWindow.__init__(self, parent)
self.setGeometry(QRect(0, 0, 599+10, 399+10))
self.move(QDesktopWidget().availableGeometry().center() - self.frameGeometry().center())
# Creamos el contenedor central, que sera organizado por pestañas
centralWidget = QTabWidget()
self.setCentralWidget(centralWidget);
# Creamos la 1ra pestaña
tab = CentralWidget()
tabLayout = QHBoxLayout()
tab.setLayout(tabLayout)
# Añadimos la pestaña al contenedor central
centralWidget.addTab(tab,"Escena 1")
logDockWidget = QDockWidget("Tools", self)
logDockWidget.setObjectName("LogDockWidget")
logDockWidget.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea)
self.addDockWidget(Qt.RightDockWidgetArea, logDockWidget)
def crearMenu():
mimenu = self.menuBar().addMenu("&Archivo")
crearMenu()
selectorLb = Selector()
picture = QPixmap('D:\Adrian\Tesis\Codigo\selector.png')
selectorLb.setPixmap(picture)
tabLayout.addWidget(selectorLb)
if __name__ == "__main__":
app = QApplication(sys.argv)
w = fPrincipal()
w.show()
sys.exit(app.exec_())