Drag an Item to another application (Solved)
-
Hello,
I want to drag an Item, for ex: a rectangle from my window and drop it in Microsoft word or odt file. When finish dropping , the document will have the image of that rectangle or some information of the rectangle (color, width, height.....) Is is possible to do that?
Thank you!
-
Hello, Is QML enough to do that or I have to use C++ ?, until now I don't have any idea about it? Could you give me some suggestion?
-
I would say that you'll need C++. I would do it that way:
QML: Start dragging, if dropped out of window: continue
Cpp: Detect whether there is an useable Application or not, if yes: continue
Cpp-QML: Get information about the QML Component and pass it to Cpp.
Cpp: Copy the retrieved information to clipboard, set the windows focus to the application window and paste it in there using Cpp.
I've never done that, it's just an idea. For pasting i would go ahead and use ring 0 to manipulate the data in your office application, if you are familiar with it. By manipulation i mean pasting the retrieved information.
-
Thanks for your guide, maybe I will try and if I have any concern I will ask you.
Thank you!
-
Hello,
I tried to use a new appoach. Since Qt 5.2 support for drag and drop external application (I hope so) . I use this code piece to drag some text from text editor to QML application, it's ok, but when I drag a word from QML APP to text editor, my program is crash:
@
Rectangle {
id: background;
color: "white";
width: 300;
height: 300;DropArea { anchors.fill: parent keys: ["text/plain"] onEntered: { //item.color = "#FCC" } onExited: { // item.color = "#EEE" } onDropped: { // item.color = "#EEE" if (drop.hasText) { if (drop.proposedAction == Qt.MoveAction || drop.proposedAction == Qt.CopyAction) { txtDrag.text = drop.text drop.acceptProposedAction() print("dragsource =",drag.source) } } } } Text { id: txtDrag text: qsTr("Hello World") Drag.active: mouseArea.drag.active Drag.dragType: Drag.Automatic Drag.mimeData: { "text/plain": txtDrag.text } Drag.proposedAction: Qt.CopyAction Drag.supportedActions: Qt.CopyAction Drag.keys: ["text/plain"] Drag.onDragStarted : { print("Start drag:") //Drag.startDrag(Qt.CopyAction); } Drag.onDragFinished: { //action.acceptProposedAction(); print("Finish Dragging"); Drag.drop(); } MouseArea { id:mouseArea; anchors.fill: parent drag.target: txtDrag } }
@
-
Hello,
After I finish dropping the text to text editor : my program crash, if I drop the text inside QML app: it still run. I also try using C++ widget to drop outside the program and it's very easy, we just set mimedata for QDrag and the text editor will receive our dragging data. But I still want to try with QML. I refer this example and It also crash : http://qt-project.org/doc/qt-5/qtquick-externaldraganddrop-example.html -
Until now, I don't know how to use drag and drop to external program using QML ; but we can incorporate with C++. For ex:
in C++:
@class A :public QObject {//remember to register A to be used in QML
Q_OBJECT
Q_INVOKABLE void DraggingProcessing(QObject *rect) {
QString strWidth = rect->property( "width" ).toString();
QString strHeight = rect->property( "height" ).toString();QDrag * drag = new QDrag( rect );
QMimeData* mime = new QMimeData;
// a custom mime type so that no other app would ever accept it
mime->setText( strWidth + " " + strHeight );
drag->setMimeData( mime );
QPixmap pix;
//get pixmap here
drag->setPixmap( pix );//to set the image while draggingdrag->exec( Qt::CopyAction );
}
in QML:
A {
id: a
}Rectangle {
id: rect
width:100
height:100
MouseArea {
id:mouseArea
anchors.fill: parent
onPositionChanged : a.DraggingProcessing(rect)
}
}@Open a text editor and drag rectangle to that text editor. Width and Height of that rectangle will be displayed on text editor
The detail of drag and drop in C++ : http://qt-project.org/doc/qt-4.8/dnd.html
Anyway, thanks onek24 for your guide, hope to receive your help in future