Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. [SOLVED]How to delete an item from the treeview by droping an item to pushbutton or to an group box
Forum Updated to NodeBB v4.3 + New Features

[SOLVED]How to delete an item from the treeview by droping an item to pushbutton or to an group box

Scheduled Pinned Locked Moved General and Desktop
drag and droptreeview
54 Posts 4 Posters 23.3k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • RatzzR Offline
    RatzzR Offline
    Ratzz
    wrote on last edited by Ratzz
    #3

    @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 .

    --Alles ist gut.

    1 Reply Last reply
    0
    • mrjjM Offline
      mrjjM Offline
      mrjj
      Lifetime Qt Champion
      wrote on last edited by
      #4

      @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 ?

      1 Reply Last reply
      0
      • RatzzR Offline
        RatzzR Offline
        Ratzz
        wrote on last edited by
        #5

        @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 meant if (event->answerRect().intersects(dropFrame->geometry()))

        --Alles ist gut.

        1 Reply Last reply
        0
        • mrjjM Offline
          mrjjM Offline
          mrjj
          Lifetime Qt Champion
          wrote on last edited by mrjj
          #6

          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 :)

          1 Reply Last reply
          0
          • RatzzR Offline
            RatzzR Offline
            Ratzz
            wrote on last edited by
            #7

            @mrjj
            Is the answerRect() member of QDropevnt(); ?
            Because i get error

             error: 'class QDropEvent' has no member named 'answerRect'
            (event->answerRect().intersects(ui->pushButton_DeleteMinorFrame->geometry())))
                     ^

            --Alles ist gut.

            mrjjM 1 Reply Last reply
            0
            • RatzzR Ratzz

              @mrjj
              Is the answerRect() member of QDropevnt(); ?
              Because i get error

               error: 'class QDropEvent' has no member named 'answerRect'
              (event->answerRect().intersects(ui->pushButton_DeleteMinorFrame->geometry())))
                       ^
              mrjjM Offline
              mrjjM Offline
              mrjj
              Lifetime Qt Champion
              wrote on last edited by
              #8

              @Ratzz said:

              event->answerRect()

              Hi. sorry my bad. its part of QDragMoveEvent
              so should check in ::dragMoveEvent instead.

              1 Reply Last reply
              0
              • SGaistS Offline
                SGaistS Offline
                SGaist
                Lifetime Qt Champion
                wrote on last edited by
                #9

                Hi,

                Wouldn't it be simpler to subclass QPushButton and add the drag'n'drop logic directly in it ?

                Interested in AI ? www.idiap.ch
                Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                mrjjM RatzzR 2 Replies Last reply
                0
                • SGaistS SGaist

                  Hi,

                  Wouldn't it be simpler to subclass QPushButton and add the drag'n'drop logic directly in it ?

                  mrjjM Offline
                  mrjjM Offline
                  mrjj
                  Lifetime Qt Champion
                  wrote on last edited by
                  #10

                  @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.

                  1 Reply Last reply
                  0
                  • RatzzR Offline
                    RatzzR Offline
                    Ratzz
                    wrote on last edited by Ratzz
                    #11

                    @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 .

                    --Alles ist gut.

                    1 Reply Last reply
                    0
                    • SGaistS SGaist

                      Hi,

                      Wouldn't it be simpler to subclass QPushButton and add the drag'n'drop logic directly in it ?

                      RatzzR Offline
                      RatzzR Offline
                      Ratzz
                      wrote on last edited by
                      #12

                      @SGaist
                      How to subclass QPushButton and add the drag'n'drop logic directly in it ??

                      --Alles ist gut.

                      1 Reply Last reply
                      0
                      • SGaistS Offline
                        SGaistS Offline
                        SGaist
                        Lifetime Qt Champion
                        wrote on last edited by
                        #13

                        The same you would any other widget. Take a look at the Drag And Drop chapter in Qt's documentation

                        Interested in AI ? www.idiap.ch
                        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                        RatzzR 1 Reply Last reply
                        0
                        • SGaistS SGaist

                          The same you would any other widget. Take a look at the Drag And Drop chapter in Qt's documentation

                          RatzzR Offline
                          RatzzR Offline
                          Ratzz
                          wrote on last edited by
                          #14

                          @SGaist
                          As suggested by @mrjj should i add QDropevnt()??
                          how will the dragMoveEvent come to know that i have to delete ?? Just dragging to pushButton_Delete will work??
                          When to call slot of deleting items??

                          --Alles ist gut.

                          mrjjM 1 Reply Last reply
                          0
                          • RatzzR Ratzz

                            @SGaist
                            As suggested by @mrjj should i add QDropevnt()??
                            how will the dragMoveEvent come to know that i have to delete ?? Just dragging to pushButton_Delete will work??
                            When to call slot of deleting items??

                            mrjjM Offline
                            mrjjM Offline
                            mrjj
                            Lifetime Qt Champion
                            wrote on last edited by
                            #15

                            @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
                            
                            1 Reply Last reply
                            0
                            • RatzzR Offline
                              RatzzR Offline
                              Ratzz
                              wrote on last edited by Ratzz
                              #16

                              @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

                              --Alles ist gut.

                              1 Reply Last reply
                              0
                              • mrjjM Offline
                                mrjjM Offline
                                mrjj
                                Lifetime Qt Champion
                                wrote on last edited by mrjj
                                #17

                                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.

                                1. save the code in a file called dropbutton.h
                                  (just to be safe, also create dropbutton.cpp as empty)
                                2. 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.
                                1 Reply Last reply
                                0
                                • C Offline
                                  C Offline
                                  ClapCreative
                                  wrote on last edited by
                                  #18

                                  Thanks mates

                                  Try us out ClapCreative.com is a professional SEO company Los Angeles offering quality SEO&#x2F;PPC Services. Contact us info@clapcreative.com or +13238632896

                                  1 Reply Last reply
                                  0
                                  • RatzzR Offline
                                    RatzzR Offline
                                    Ratzz
                                    wrote on last edited by
                                    #19

                                    @mrjj
                                    Yes, i Tried you code which turns out to be a Dropbutton. How to implement it in my code ?

                                    --Alles ist gut.

                                    mrjjM 1 Reply Last reply
                                    0
                                    • RatzzR Ratzz

                                      @mrjj
                                      Yes, i Tried you code which turns out to be a Dropbutton. How to implement it in my code ?

                                      mrjjM Offline
                                      mrjjM Offline
                                      mrjj
                                      Lifetime Qt Champion
                                      wrote on last edited by
                                      #20

                                      @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.

                                      RatzzR 1 Reply Last reply
                                      0
                                      • mrjjM mrjj

                                        @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.

                                        RatzzR Offline
                                        RatzzR Offline
                                        Ratzz
                                        wrote on last edited by
                                        #21

                                        @mrjj
                                        Yes its working now fine..
                                        I have group box adjacent to treeview. Can i implement the same to groupbox?

                                        --Alles ist gut.

                                        mrjjM 1 Reply Last reply
                                        0
                                        • RatzzR Ratzz

                                          @mrjj
                                          Yes its working now fine..
                                          I have group box adjacent to treeview. Can i implement the same to groupbox?

                                          mrjjM Offline
                                          mrjjM Offline
                                          mrjj
                                          Lifetime Qt Champion
                                          wrote on last edited by mrjj
                                          #22

                                          @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();
                                            }
                                          };
                                          
                                          RatzzR 1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved