def initUI(self): draggable_list_view = QListView() draggable_list_view.setDragEnabled(True) model1 = QStandardItemModel() draggable_list_view.setModel(model1) for it in ["yo", "yi", "ya"]: item = QStandardItem(it) model1.appendRow(item) droppable_list_view = QListView() droppable_list_view.setAcceptDrops(True) droppable_list_view.setDropIndicatorShown(True) model2 = QStandardItemModel() droppable_list_view.setModel(model2) lay = QHBoxLayout(self) lay.addWidget(draggable_list_view) lay.addWidget(droppable_list_view) self.setGeometry(300, 300, 300, 150)
class MainWindow(QWidget): #def __init__(self): def __init__(self, parent=None): #super().__init__() super(MainWindow, self).__init__(parent) self.initUI() def initUI(self): self.methods = ['option 1', 'option 2', 'option 3'] self.central_widget = QWidget(self) self.layout = QVBoxLayout(self.central_widget) self.layout.addStretch() self.create_methods_list() self.layout.addWidget(self.methods_list) self.layout.addStretch() wordLabel = DragLabel('draggami', self) #self.setCentralWidget(self.central_widget) self.setAcceptDrops(True) self.show() def create_methods_list(self): self.methods_list = QListView() self.methods_list.setDragDropMode(QListView.InternalMove) self.methods_list.setDefaultDropAction(Qt.MoveAction) self.methods_list.setDragDropMode(False) self.methods_list.setAcceptDrops(True) self.methods_list.setDropIndicatorShown(True) self.methods_list.setDragEnabled(True) self.methods_list.setWindowTitle('Method Order') self.methods_model = QStandardItemModel(self.methods_list) for method in self.methods: item = QStandardItem(method) item.setData(method) item.setCheckable(True) item.setDragEnabled(True) item.setDropEnabled(False) item.setCheckState(True) self.methods_model.appendRow(item) self.methods_model.itemChanged.connect(self.method_item_changed) self.methods_list.setModel(self.methods_model) self.methods_list.setMinimumHeight( self.methods_list.sizeHintForRow(0) * (self.methods_model.rowCount() + 2)) def method_item_changed(self): print(self.methods_model.rowCount()) i = 0 new_methods = [] while self.methods_model.item(i): if self.methods_model.item(i).checkState(): new_methods.append(self.methods_model.item(i).data()) i += 1 self.methods = new_methods print(self.methods) def dragEnterEvent(self, event): if event.mimeData().hasText(): if event.source() in self.children(): event.setDropAction(Qt.MoveAction) event.accept() else: event.acceptProposedAction() else: event.ignore() def dropEvent(self, event): print('evento di drop') if event.mimeData().hasText(): mime = event.mimeData() pieces = mime.text().split() position = event.pos() hotSpot = QPoint() hotSpotPos = mime.data('application/x-hotspot').split(' ') pippo = QListView() pippo.append self.lista """ if len(hotSpotPos) == 2: hotSpot.setX(hotSpotPos[0].toInt()[0]) hotSpot.setY(hotSpotPos[1].toInt()[0]) for piece in pieces: newLabel = DragLabel(piece, self) newLabel.move(position - hotSpot) newLabel.show() position += QPoint(newLabel.width(), 0) if event.source() in self.children(): event.setDropAction(Qt.MoveAction) event.accept() else: event.acceptProposedAction() """ else: event.ignore()
class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.puzzleImage = QPixmap() self.setupMenus() self.setupWidgets() self.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) self.setWindowTitle("Puzzle") def openImage(self, path=None): if not path: path, _ = QFileDialog.getOpenFileName( self, "Open Image", "", "Image Files (*.png *.jpg *.bmp)") if path: newImage = QPixmap() if not newImage.load(path): QMessageBox.warning( self, "Open Image", "The image file could not be loaded.", QMessageBox.Cancel, ) return self.puzzleImage = newImage self.setupPuzzle() def setCompleted(self): QMessageBox.information( self, "Puzzle Completed", "Congratulations! You have completed the puzzle!\nClick OK " "to start again.", QMessageBox.Ok, ) self.setupPuzzle() def setupPuzzle(self): size = min(self.puzzleImage.width(), self.puzzleImage.height()) self.puzzleImage = self.puzzleImage.copy( (self.puzzleImage.width() - size) / 2, (self.puzzleImage.height() - size) / 2, size, size, ).scaled(400, 400, Qt.IgnoreAspectRatio, Qt.SmoothTransformation) random.seed(QCursor.pos().x() ^ QCursor.pos().y()) self.model.addPieces(self.puzzleImage) self.puzzleWidget.clear() def setupMenus(self): fileMenu = self.menuBar().addMenu("&File") openAction = fileMenu.addAction("&Open...") openAction.setShortcut("Ctrl+O") exitAction = fileMenu.addAction("E&xit") exitAction.setShortcut("Ctrl+Q") gameMenu = self.menuBar().addMenu("&Game") restartAction = gameMenu.addAction("&Restart") openAction.triggered.connect(self.openImage) exitAction.triggered.connect(QApplication.instance().quit) restartAction.triggered.connect(self.setupPuzzle) def setupWidgets(self): frame = QFrame() frameLayout = QHBoxLayout(frame) self.piecesList = QListView() self.piecesList.setDragEnabled(True) self.piecesList.setViewMode(QListView.IconMode) self.piecesList.setIconSize(QSize(60, 60)) self.piecesList.setGridSize(QSize(80, 80)) self.piecesList.setSpacing(10) self.piecesList.setMovement(QListView.Snap) self.piecesList.setAcceptDrops(True) self.piecesList.setDropIndicatorShown(True) self.model = PiecesModel(self) self.piecesList.setModel(self.model) self.puzzleWidget = PuzzleWidget() self.puzzleWidget.puzzleCompleted.connect(self.setCompleted, Qt.QueuedConnection) frameLayout.addWidget(self.piecesList) frameLayout.addWidget(self.puzzleWidget) self.setCentralWidget(frame)
class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.puzzleImage = QPixmap() self.setupMenus() self.setupWidgets() self.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) self.setWindowTitle("Puzzle") def openImage(self, path=None): if not path: path, _ = QFileDialog.getOpenFileName(self, "Open Image", '', "Image Files (*.png *.jpg *.bmp)") if path: newImage = QPixmap() if not newImage.load(path): QMessageBox.warning(self, "Open Image", "The image file could not be loaded.", QMessageBox.Cancel) return self.puzzleImage = newImage self.setupPuzzle() def setCompleted(self): QMessageBox.information(self, "Puzzle Completed", "Congratulations! You have completed the puzzle!\nClick OK " "to start again.", QMessageBox.Ok) self.setupPuzzle() def setupPuzzle(self): size = min(self.puzzleImage.width(), self.puzzleImage.height()) self.puzzleImage = self.puzzleImage.copy((self.puzzleImage.width()-size)/2, (self.puzzleImage.height() - size)/2, size, size).scaled(400, 400, Qt.IgnoreAspectRatio, Qt.SmoothTransformation) random.seed(QCursor.pos().x() ^ QCursor.pos().y()) self.model.addPieces(self.puzzleImage) self.puzzleWidget.clear() def setupMenus(self): fileMenu = self.menuBar().addMenu("&File") openAction = fileMenu.addAction("&Open...") openAction.setShortcut("Ctrl+O") exitAction = fileMenu.addAction("E&xit") exitAction.setShortcut("Ctrl+Q") gameMenu = self.menuBar().addMenu("&Game") restartAction = gameMenu.addAction("&Restart") openAction.triggered.connect(self.openImage) exitAction.triggered.connect(QApplication.instance().quit) restartAction.triggered.connect(self.setupPuzzle) def setupWidgets(self): frame = QFrame() frameLayout = QHBoxLayout(frame) self.piecesList = QListView() self.piecesList.setDragEnabled(True) self.piecesList.setViewMode(QListView.IconMode) self.piecesList.setIconSize(QSize(60,60)) self.piecesList.setGridSize(QSize(80,80)) self.piecesList.setSpacing(10) self.piecesList.setMovement(QListView.Snap) self.piecesList.setAcceptDrops(True) self.piecesList.setDropIndicatorShown(True) self.model = PiecesModel(self) self.piecesList.setModel(self.model) self.puzzleWidget = PuzzleWidget() self.puzzleWidget.puzzleCompleted.connect(self.setCompleted, Qt.QueuedConnection) frameLayout.addWidget(self.piecesList) frameLayout.addWidget(self.puzzleWidget) self.setCentralWidget(frame)