[SOLVED]How to delete an item from the treeview by droping an item to pushbutton or to an group box
-
wrote on 10 Oct 2015, 07:54 last edited by Ratzz 10 Oct 2015, 07:55
@mrjj
Thanks for the reply .
I have set setAcceptDrops(true);ui->treeView->setAcceptDrops(true);
and created void Window::dragMoveEvent(QDragMoveEvent *event)
and
void Window::dropEvent(QDropEvent *event)void Window::dragMoveEvent(QDragMoveEvent *event) { Window *source = qobject_cast<Window *>(event->source()); if (source && source != this) { event->setDropAction(Qt::MoveAction); event->accept(); } } void Window::dropEvent(QDropEvent *event) { Window *source =qobject_cast<Window *>(event->source()); if (source && source != this) { event->setDropAction(Qt::MoveAction); event->accept(); } }
I am unaware of how to set condition .
-
@Ratzz said:
Hmm. Maybe I misunderstood you,
You want to drag from the tree to outside. ?
so ui->treeView->setAcceptDrops(true);
tells treeview it can be drop target. ( dropped on)
Should also tell you MainWindow
so Window (which is your mainwindow ? )
Normally it would be named MainWindow but if Window is you mainwin then all fine."set condition " ?
you mean
if (event->answerRect().intersects(dropFrame->geometry()))
or ? -
wrote on 10 Oct 2015, 08:24 last edited by
@mrjj
Yes , I want to drag the item from the tree to outside and to pushbutton "Delete item".
I have to set setAcceptDrops(true); to pushbutton and groupbox area right?
yes i meantif (event->answerRect().intersects(dropFrame->geometry()))
-
Lifetime Qt Championwrote on 10 Oct 2015, 08:53 last edited by mrjj 10 Oct 2015, 08:54
Ok so your mainwindow is the drop target
and you should call etAcceptDrops(true); in constructor.and this line
if (event->answerRect().intersects(dropFrame->geometry()))should be used to check its actually dropped on the button.
dropFrame should just be the name of your delete button.
It says if the Area for the drop is within the dropFrame Area.
as it , "dropped on the frame"sosomething like
void (Main?)Window::dropEvent(QDropEvent *event) { Window *source =qobject_cast<Window *>(event->source()); if (source && source != this && (event->answerRect().intersects(ui->ThatButton->geometry()))) { event->setDropAction(Qt::MoveAction); event->accept(); }
All "Window" should be "MainWindow" in case its normal project. Unless you did
rename name it to Window yourself :) -
wrote on 10 Oct 2015, 09:02 last edited by
@mrjj
Is the answerRect() member of QDropevnt(); ?
Because i get errorerror: 'class QDropEvent' has no member named 'answerRect' (event->answerRect().intersects(ui->pushButton_DeleteMinorFrame->geometry()))) ^
-
@mrjj
Is the answerRect() member of QDropevnt(); ?
Because i get errorerror: 'class QDropEvent' has no member named 'answerRect' (event->answerRect().intersects(ui->pushButton_DeleteMinorFrame->geometry()))) ^
@Ratzz said:
event->answerRect()
Hi. sorry my bad. its part of QDragMoveEvent
so should check in ::dragMoveEvent instead. -
Hi,
Wouldn't it be simpler to subclass QPushButton and add the drag'n'drop logic directly in it ?
-
Hi,
Wouldn't it be simpler to subclass QPushButton and add the drag'n'drop logic directly in it ?
@SGaist
Yeah that is also an option , but since normally you already have a QMainWindow
subclass, i thought it could be slightly faster to add
and would work with most widgets after. -
wrote on 12 Oct 2015, 04:24 last edited by Ratzz 10 Dec 2015, 05:29
@mrjj
Adding event dragMoveEvent will work ??
Should not i add QDropevnt() ??void MyWindow::dragMoveEvent(QDragMoveEvent *event) { MyWindow *source =qobject_cast<MyWindow *>(event->source()); if (source && source != this && (event->answerRect().intersects(ui->pushButton_Delete->geometry()))) { event->setDropAction(Qt::MoveAction); event->accept(); } }
I added the above but did not .
-
Hi,
Wouldn't it be simpler to subclass QPushButton and add the drag'n'drop logic directly in it ?
-
The same you would any other widget. Take a look at the Drag And Drop chapter in Qt's documentation
-
The same you would any other widget. Take a look at the Drag And Drop chapter in Qt's documentation
-
@Ratzz
Hi yes you would still need the DropEvent.This works with ListWidget with dragDrop mode set to DragOnly.
Since the DropAction is "move", it did remove the item from the list.
Your result may vary.#ifndef DROPBUTTON_H #define DROPBUTTON_H #include <QPushButton> #include <QDragMoveEvent> class DropButton : public QPushButton { Q_OBJECT public: explicit DropButton(QWidget* parent = 0) : QPushButton(parent) { setAcceptDrops(true); } protected: void dragEnterEvent(QDragEnterEvent* event) { event->acceptProposedAction(); } void dropEvent(QDropEvent* event) { event->setDropAction(Qt::MoveAction); event->accept(); } }; #endif // DROPBUTTON_H
-
wrote on 13 Oct 2015, 09:55 last edited by Ratzz
@mrjj
I tried this#include <QDragMoveEvent> #include <QDropEvent> protected: void dragMoveEvent(QDragMoveEvent *event); void dropEvent(QDropEvent *event); ui->pushButton_DeleteMinorFrame->setAcceptDrops(true); void Window::dragMoveEvent(QDragMoveEvent *event) { Window *source =qobject_cast<Window *>(event->source()); if (source && source != this && (event->answerRect().intersects(ui->pushButton_DeleteMinorFrame->geometry()))) { event->acceptProposedAction(); } } void Window::dropEvent(QDropEvent *event) { event->setDropAction(Qt::MoveAction); event->accept(); }
But above does not work for me. Where did i miss??
Control does not come to these function dragMoveEvent/dropEvent when i drag and drop -
Hi you have to use the Dropbutton also.
That is why I though using Mainwindow would be easier.
Best way to do that is to use the promote feature.
- save the code in a file called dropbutton.h
(just to be safe, also create dropbutton.cpp as empty) - right click on your button you want to be a drop button.
Select "Promote To..."
In "Promoted classname" type
DropButton
(case Matters!)
in
header file : type
dropbutton.h
Then click "Add" and then Promote.
Now when you run the program, the normal buttons becomes the DropButton.
- save the code in a file called dropbutton.h
-
wrote on 13 Oct 2015, 10:44 last edited by
Thanks mates
-
@mrjj
Yes, i Tried you code which turns out to be a Dropbutton. How to implement it in my code ?@Ratzz
As I wrote in answer ?
Using the promote feature.
Which will runtime replace a normal button with the DropButton.
Or you can new a button you self
Like
Dropbutton *but=Dropbutton (this)
and insert into your window/layout. -
@Ratzz
As I wrote in answer ?
Using the promote feature.
Which will runtime replace a normal button with the DropButton.
Or you can new a button you self
Like
Dropbutton *but=Dropbutton (this)
and insert into your window/layout. -
@mrjj
Yes its working now fine..
I have group box adjacent to treeview. Can i implement the same to groupbox?@Ratzz
Super.
Well If you promote the GroupBox, there might be issue with
Parent. I have never tried it.
Try it :)
If it says funny stuff , just demote it to a groupbox again.Else its pretty much the same, except new filename and new name.
#include <QGroupBox> #include <QDragMoveEvent> class DropGroupBox : public QGroupBox { Q_OBJECT public: explicit DropGroupBox(QWidget* parent = 0) : QGroupBox(parent) { setAcceptDrops(true); } protected: void dragEnterEvent(QDragEnterEvent* event) { event->acceptProposedAction(); } void dropEvent(QDropEvent* event) { event->setDropAction(Qt::MoveAction); event->accept(); } };
12/54