1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
#!/usr/bin/env python
"""***************************************************************************
**
** Copyright (C) 2005-2005 Trolltech AS. All rights reserved.
**
** This file is part of the example classes of the Qt Toolkit.
**
** This file may be used under the terms of the GNU General Public
** License version 2.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of
** this file. Please review the following information to ensure GNU
** General Public Licensing requirements will be met:
** http://www.trolltech.com/products/qt/opensource.html
**
** If you are unsure which license is appropriate for your use, please
** review the following information:
** http://www.trolltech.com/products/qt/licensing.html or contact the
** sales department at sales@trolltech.com.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
***************************************************************************"""
import sys
from PyQt4 import QtCore, QtGui
import draggabletext_rc
class DragLabel(QtGui.QLabel):
def __init__(self, text, parent=None):
QtGui.QLabel.__init__(self, text, parent)
self.setFrameShape(QtGui.QFrame.Panel)
self.setFrameShadow(QtGui.QFrame.Raised)
def mousePressEvent(self, event):
plainText = self.text() # for quoting purposes
mimeData = QtCore.QMimeData()
mimeData.setText(plainText)
drag = QtGui.QDrag(self)
drag.setMimeData(mimeData)
drag.setHotSpot(event.pos() - self.rect().topLeft())
dropAction = drag.start(QtCore.Qt.CopyAction | QtCore.Qt.MoveAction)
if dropAction == QtCore.Qt.MoveAction:
self.close()
self.update()
class DragWidget(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
dictionaryFile = QtCore.QFile(":/dictionary/words.txt")
dictionaryFile.open(QtCore.QIODevice.ReadOnly)
inputStream = QtCore.QTextStream(dictionaryFile)
x = 5
y = 5
while not inputStream.atEnd():
word = QtCore.QString()
inputStream >> word
if not word.isEmpty():
wordLabel = DragLabel(word, self)
wordLabel.move(x, y)
wordLabel.show()
x += wordLabel.width() + 2
if x >= 195:
x = 5
y += wordLabel.height() + 2
newPalette = self.palette()
newPalette.setColor(QtGui.QPalette.Background, QtCore.Qt.white)
self.setPalette(newPalette)
self.setAcceptDrops(True)
self.setMinimumSize(400, max(200, y))
self.setWindowTitle(self.tr("Draggable Text"))
def dragEnterEvent(self, event):
if event.mimeData().hasText():
event.acceptProposedAction()
else:
event.ignore()
def dropEvent(self, event):
if event.mimeData().hasText():
pieces = event.mimeData().text().split(QtCore.QRegExp("\\s+"),
QtCore.QString.SkipEmptyParts)
position = event.pos()
for piece in pieces:
newLabel = DragLabel(piece, self)
newLabel.move(position)
newLabel.show()
position += QtCore.QPoint(newLabel.width(), 0)
if event.source() in self.children():
event.setDropAction(QtCore.Qt.MoveAction)
event.accept()
else:
event.acceptProposedAction()
else:
event.ignore()
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
window = DragWidget()
window.show()
sys.exit(app.exec_())
|