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. Drag and Drop Text between tableview
Qt 6.11 is out! See what's new in the release blog

Drag and Drop Text between tableview

Scheduled Pinned Locked Moved Solved General and Desktop
14 Posts 4 Posters 2.2k Views 1 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.
  • VRoninV VRonin

    @TheCipo76 said in Drag and Drop Text between tableview:

    it's the correct way?

    No, the correct way is via QAbstractItemModel::canDropMimeData/QAbstractItemModel::dropMimeData but if you use QStandardItemModel then it should already be implemented for free, no need do do anything manually

    TheCipo76T Offline
    TheCipo76T Offline
    TheCipo76
    wrote on last edited by
    #5

    @VRonin Thank you for response

    but..

    if i use QStandardItemModel i can't order tableview (i have int value in my database) with a simple click..

    where can i find more information about how to do it with QAbstractItemModel as you up-wrote ?

    1 Reply Last reply
    0
    • VRoninV Offline
      VRoninV Offline
      VRonin
      wrote on last edited by
      #6

      if i use QStandardItemModel i can't order tableview (i have int value in my database) with a simple click

      You can, see QSortFilterProxyModel. Anyway, is the source or the destination being an QSqlTableModel?

      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
      ~Napoleon Bonaparte

      On a crusade to banish setIndexWidget() from the holy land of Qt

      TheCipo76T 1 Reply Last reply
      0
      • VRoninV VRonin

        if i use QStandardItemModel i can't order tableview (i have int value in my database) with a simple click

        You can, see QSortFilterProxyModel. Anyway, is the source or the destination being an QSqlTableModel?

        TheCipo76T Offline
        TheCipo76T Offline
        TheCipo76
        wrote on last edited by
        #7

        @VRonin yes, the source was a QSqlTableModel

        1 Reply Last reply
        0
        • VRoninV Offline
          VRoninV Offline
          VRonin
          wrote on last edited by
          #8

          I see, it's a bit fiddly because QStandardItemModel by default appends child items.
          Try something like this:

          #include <QApplication>
          #include <QMimeData>
          #include <QStandardItemModel>
          #include <QTableView>
          #include <QSqlDatabase>
          #include <QSqlQuery>
          #include <QSqlTableModel>
          #include <QHBoxLayout>
          
          class DragSqlTableModel : public QSqlTableModel{
              Q_DISABLE_COPY(DragSqlTableModel)
          public:
              using  QSqlTableModel::QSqlTableModel;
              Qt::ItemFlags flags(const QModelIndex &index) const override {return QSqlTableModel::flags(index) | Qt::ItemIsDragEnabled;}
          
          };
          class OverwriteModel : public QStandardItemModel{
              Q_DISABLE_COPY(OverwriteModel)
          public:
              using QStandardItemModel::QStandardItemModel;
              bool dropMimeData(const QMimeData *data, Qt::DropAction,
                                   int, int, const QModelIndex &parent)  override
              {
                  const QByteArray mimeData = data->data("application/x-qabstractitemmodeldatalist");
                      QDataStream mimeReader(mimeData);
                      int junk;
                      QMap<int,QVariant> modelData;
                      for(;;){
                          mimeReader.startTransaction();
                          mimeReader >> junk >> junk >> modelData;
                          if(!mimeReader.commitTransaction())
                              break;
                          setItemData(parent,modelData);
                      }
                  return true;
              }
          };
          
          int main(int argc, char **argv) {
              QApplication app(argc,argv);
              QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
                 db.setDatabaseName(":memory:");
             if (!db.open()) return 1;
             QSqlQuery query;
             Q_ASSUME(query.exec("create table person (id int primary key, "
                           "firstname varchar(20), lastname varchar(20))"));
                Q_ASSUME(query.exec("insert into person values(101, 'Danny', 'Young')"));
                Q_ASSUME(query.exec("insert into person values(102, 'Christine', 'Holand')"));
                Q_ASSUME(query.exec("insert into person values(103, 'Lars', 'Gordon')"));
                Q_ASSUME(query.exec("insert into person values(104, 'Roberto', 'Robitaille')"));
                Q_ASSUME(query.exec("insert into person values(105, 'Maria', 'Papadopoulos')"));
              OverwriteModel destination(3,2);
          
              DragSqlTableModel source(nullptr,db);
              source.setTable("person");
              source.select();
              QWidget mainWid;
              auto sourceView=new QTableView(&mainWid);
              sourceView->setDragEnabled(true);
              sourceView->setModel(&source);
              auto destinationView=new QTableView(&mainWid);
              destinationView->setModel(&destination);
              destinationView->setDragDropMode(QAbstractItemView::DropOnly);
              QHBoxLayout* mainLay = new QHBoxLayout(&mainWid);
              mainLay->addWidget(destinationView);
              mainLay->addWidget(sourceView);
              mainWid.show();
              return app.exec();
          }
          

          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
          ~Napoleon Bonaparte

          On a crusade to banish setIndexWidget() from the holy land of Qt

          TheCipo76T 3 Replies Last reply
          4
          • VRoninV VRonin

            I see, it's a bit fiddly because QStandardItemModel by default appends child items.
            Try something like this:

            #include <QApplication>
            #include <QMimeData>
            #include <QStandardItemModel>
            #include <QTableView>
            #include <QSqlDatabase>
            #include <QSqlQuery>
            #include <QSqlTableModel>
            #include <QHBoxLayout>
            
            class DragSqlTableModel : public QSqlTableModel{
                Q_DISABLE_COPY(DragSqlTableModel)
            public:
                using  QSqlTableModel::QSqlTableModel;
                Qt::ItemFlags flags(const QModelIndex &index) const override {return QSqlTableModel::flags(index) | Qt::ItemIsDragEnabled;}
            
            };
            class OverwriteModel : public QStandardItemModel{
                Q_DISABLE_COPY(OverwriteModel)
            public:
                using QStandardItemModel::QStandardItemModel;
                bool dropMimeData(const QMimeData *data, Qt::DropAction,
                                     int, int, const QModelIndex &parent)  override
                {
                    const QByteArray mimeData = data->data("application/x-qabstractitemmodeldatalist");
                        QDataStream mimeReader(mimeData);
                        int junk;
                        QMap<int,QVariant> modelData;
                        for(;;){
                            mimeReader.startTransaction();
                            mimeReader >> junk >> junk >> modelData;
                            if(!mimeReader.commitTransaction())
                                break;
                            setItemData(parent,modelData);
                        }
                    return true;
                }
            };
            
            int main(int argc, char **argv) {
                QApplication app(argc,argv);
                QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
                   db.setDatabaseName(":memory:");
               if (!db.open()) return 1;
               QSqlQuery query;
               Q_ASSUME(query.exec("create table person (id int primary key, "
                             "firstname varchar(20), lastname varchar(20))"));
                  Q_ASSUME(query.exec("insert into person values(101, 'Danny', 'Young')"));
                  Q_ASSUME(query.exec("insert into person values(102, 'Christine', 'Holand')"));
                  Q_ASSUME(query.exec("insert into person values(103, 'Lars', 'Gordon')"));
                  Q_ASSUME(query.exec("insert into person values(104, 'Roberto', 'Robitaille')"));
                  Q_ASSUME(query.exec("insert into person values(105, 'Maria', 'Papadopoulos')"));
                OverwriteModel destination(3,2);
            
                DragSqlTableModel source(nullptr,db);
                source.setTable("person");
                source.select();
                QWidget mainWid;
                auto sourceView=new QTableView(&mainWid);
                sourceView->setDragEnabled(true);
                sourceView->setModel(&source);
                auto destinationView=new QTableView(&mainWid);
                destinationView->setModel(&destination);
                destinationView->setDragDropMode(QAbstractItemView::DropOnly);
                QHBoxLayout* mainLay = new QHBoxLayout(&mainWid);
                mainLay->addWidget(destinationView);
                mainLay->addWidget(sourceView);
                mainWid.show();
                return app.exec();
            }
            
            TheCipo76T Offline
            TheCipo76T Offline
            TheCipo76
            wrote on last edited by
            #9
            This post is deleted!
            1 Reply Last reply
            0
            • VRoninV VRonin

              I see, it's a bit fiddly because QStandardItemModel by default appends child items.
              Try something like this:

              #include <QApplication>
              #include <QMimeData>
              #include <QStandardItemModel>
              #include <QTableView>
              #include <QSqlDatabase>
              #include <QSqlQuery>
              #include <QSqlTableModel>
              #include <QHBoxLayout>
              
              class DragSqlTableModel : public QSqlTableModel{
                  Q_DISABLE_COPY(DragSqlTableModel)
              public:
                  using  QSqlTableModel::QSqlTableModel;
                  Qt::ItemFlags flags(const QModelIndex &index) const override {return QSqlTableModel::flags(index) | Qt::ItemIsDragEnabled;}
              
              };
              class OverwriteModel : public QStandardItemModel{
                  Q_DISABLE_COPY(OverwriteModel)
              public:
                  using QStandardItemModel::QStandardItemModel;
                  bool dropMimeData(const QMimeData *data, Qt::DropAction,
                                       int, int, const QModelIndex &parent)  override
                  {
                      const QByteArray mimeData = data->data("application/x-qabstractitemmodeldatalist");
                          QDataStream mimeReader(mimeData);
                          int junk;
                          QMap<int,QVariant> modelData;
                          for(;;){
                              mimeReader.startTransaction();
                              mimeReader >> junk >> junk >> modelData;
                              if(!mimeReader.commitTransaction())
                                  break;
                              setItemData(parent,modelData);
                          }
                      return true;
                  }
              };
              
              int main(int argc, char **argv) {
                  QApplication app(argc,argv);
                  QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
                     db.setDatabaseName(":memory:");
                 if (!db.open()) return 1;
                 QSqlQuery query;
                 Q_ASSUME(query.exec("create table person (id int primary key, "
                               "firstname varchar(20), lastname varchar(20))"));
                    Q_ASSUME(query.exec("insert into person values(101, 'Danny', 'Young')"));
                    Q_ASSUME(query.exec("insert into person values(102, 'Christine', 'Holand')"));
                    Q_ASSUME(query.exec("insert into person values(103, 'Lars', 'Gordon')"));
                    Q_ASSUME(query.exec("insert into person values(104, 'Roberto', 'Robitaille')"));
                    Q_ASSUME(query.exec("insert into person values(105, 'Maria', 'Papadopoulos')"));
                  OverwriteModel destination(3,2);
              
                  DragSqlTableModel source(nullptr,db);
                  source.setTable("person");
                  source.select();
                  QWidget mainWid;
                  auto sourceView=new QTableView(&mainWid);
                  sourceView->setDragEnabled(true);
                  sourceView->setModel(&source);
                  auto destinationView=new QTableView(&mainWid);
                  destinationView->setModel(&destination);
                  destinationView->setDragDropMode(QAbstractItemView::DropOnly);
                  QHBoxLayout* mainLay = new QHBoxLayout(&mainWid);
                  mainLay->addWidget(destinationView);
                  mainLay->addWidget(sourceView);
                  mainWid.show();
                  return app.exec();
              }
              
              TheCipo76T Offline
              TheCipo76T Offline
              TheCipo76
              wrote on last edited by TheCipo76
              #10

              @VRonin Great!! This code works!

              now i've to adapt it to my project

              Thank you very much!!!

              1 Reply Last reply
              0
              • VRoninV VRonin

                I see, it's a bit fiddly because QStandardItemModel by default appends child items.
                Try something like this:

                #include <QApplication>
                #include <QMimeData>
                #include <QStandardItemModel>
                #include <QTableView>
                #include <QSqlDatabase>
                #include <QSqlQuery>
                #include <QSqlTableModel>
                #include <QHBoxLayout>
                
                class DragSqlTableModel : public QSqlTableModel{
                    Q_DISABLE_COPY(DragSqlTableModel)
                public:
                    using  QSqlTableModel::QSqlTableModel;
                    Qt::ItemFlags flags(const QModelIndex &index) const override {return QSqlTableModel::flags(index) | Qt::ItemIsDragEnabled;}
                
                };
                class OverwriteModel : public QStandardItemModel{
                    Q_DISABLE_COPY(OverwriteModel)
                public:
                    using QStandardItemModel::QStandardItemModel;
                    bool dropMimeData(const QMimeData *data, Qt::DropAction,
                                         int, int, const QModelIndex &parent)  override
                    {
                        const QByteArray mimeData = data->data("application/x-qabstractitemmodeldatalist");
                            QDataStream mimeReader(mimeData);
                            int junk;
                            QMap<int,QVariant> modelData;
                            for(;;){
                                mimeReader.startTransaction();
                                mimeReader >> junk >> junk >> modelData;
                                if(!mimeReader.commitTransaction())
                                    break;
                                setItemData(parent,modelData);
                            }
                        return true;
                    }
                };
                
                int main(int argc, char **argv) {
                    QApplication app(argc,argv);
                    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
                       db.setDatabaseName(":memory:");
                   if (!db.open()) return 1;
                   QSqlQuery query;
                   Q_ASSUME(query.exec("create table person (id int primary key, "
                                 "firstname varchar(20), lastname varchar(20))"));
                      Q_ASSUME(query.exec("insert into person values(101, 'Danny', 'Young')"));
                      Q_ASSUME(query.exec("insert into person values(102, 'Christine', 'Holand')"));
                      Q_ASSUME(query.exec("insert into person values(103, 'Lars', 'Gordon')"));
                      Q_ASSUME(query.exec("insert into person values(104, 'Roberto', 'Robitaille')"));
                      Q_ASSUME(query.exec("insert into person values(105, 'Maria', 'Papadopoulos')"));
                    OverwriteModel destination(3,2);
                
                    DragSqlTableModel source(nullptr,db);
                    source.setTable("person");
                    source.select();
                    QWidget mainWid;
                    auto sourceView=new QTableView(&mainWid);
                    sourceView->setDragEnabled(true);
                    sourceView->setModel(&source);
                    auto destinationView=new QTableView(&mainWid);
                    destinationView->setModel(&destination);
                    destinationView->setDragDropMode(QAbstractItemView::DropOnly);
                    QHBoxLayout* mainLay = new QHBoxLayout(&mainWid);
                    mainLay->addWidget(destinationView);
                    mainLay->addWidget(sourceView);
                    mainWid.show();
                    return app.exec();
                }
                
                TheCipo76T Offline
                TheCipo76T Offline
                TheCipo76
                wrote on last edited by TheCipo76
                #11

                @VRonin i have copied the class definition into my dialog.h

                #ifndef PIANIFICAPRODUZIONE_H
                #define PIANIFICAPRODUZIONE_H
                
                #include <QDialog>
                #include <QSqlTableModel>
                #include <QMimeData>
                #include <QTableView>
                #include <QStandardItemModel>
                #include <QSqlDatabase>
                #include <QSqlQuery>
                #include <QSqlTableModel>
                
                
                class DragSqlTableModel : public QSqlTableModel{
                    Q_DISABLE_COPY(DragSqlTableModel)
                
                public:
                    using  QSqlTableModel::QSqlTableModel;
                    Qt::ItemFlags flags(const QModelIndex &index) const override {return QSqlTableModel::flags(index) | Qt::ItemIsDragEnabled;}
                
                };
                
                class OverwriteModel : public QStandardItemModel{
                    Q_DISABLE_COPY(OverwriteModel)
                
                public:
                    using QStandardItemModel::QStandardItemModel;
                    bool dropMimeData(const QMimeData *data, Qt::DropAction,
                                         int, int, const QModelIndex &parent)  override
                    {
                        const QByteArray mimeData = data->data("application/x-qabstractitemmodeldatalist");
                            QDataStream mimeReader(mimeData);
                            int junk;
                            QMap<int,QVariant> modelData;
                            for(;;){
                                mimeReader.startTransaction();
                                mimeReader >> junk >> junk >> modelData;
                                if(!mimeReader.commitTransaction())
                                    break;
                                setItemData(parent,modelData);
                            }
                        return true;
                    }
                };
                
                namespace Ui {
                class pianificaproduzione;
                }
                
                class pianificaproduzione : public QDialog
                {
                    Q_OBJECT
                
                public:
                    explicit pianificaproduzione(QWidget *parent = nullptr, const QString &Utente="", const QString &Password="");
                    ~pianificaproduzione();
                
                    QString Utente, Password;
                
                private:
                    Ui::pianificaproduzione *ui;
                
                    QSqlTableModel *mModel;
                    QSqlDatabase mDatabase;
                    DragSqlTableModel *source;
                    OverwriteModel *model;
                };
                
                
                
                #endif // PIANIFICAPRODUZIONE_H
                
                

                i've used DragSqlTableModel instead QSqlTableModel in dialog.cpp

                    source = new DragSqlTableModel(this);
                    source->setTable("ORDINI");
                    source->select();
                    ui->tableView_Elenco->setModel(source);
                    ui->tableView_Elenco->setEditTriggers(QAbstractItemView::NoEditTriggers);
                    ui->tableView_Elenco->setSelectionMode(QAbstractItemView::SingleSelection);
                    ui->tableView_Elenco->setDragEnabled(true);
                    ui->tableView_Elenco->setDropIndicatorShown(true);
                    ui->tableView_Elenco->setSortingEnabled(true); // Ordina al click su Header
                    ui->tableView_Elenco->horizontalHeader()->setSectionsClickable(1);
                    ui->tableView_Elenco->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
                    ui->tableView_Elenco->setColumnHidden(0, true);
                    ui->tableView_Elenco->setColumnHidden(1, true);
                    ui->tableView_Elenco->setColumnHidden(2, true);
                    ui->tableView_Elenco->setColumnHidden(7, true);
                    ui->tableView_Elenco->setColumnHidden(9, true);
                    ui->tableView_Elenco->setColumnHidden(10, true);
                    ui->tableView_Elenco->setColumnHidden(11, true);
                    ui->tableView_Elenco->setColumnHidden(12, true);
                    ui->tableView_Elenco->setColumnHidden(13, true);
                    ui->tableView_Elenco->setColumnHidden(14, true);
                    ui->tableView_Elenco->setColumnHidden(15, true);
                    ui->tableView_Elenco->setColumnHidden(16, true);
                    ui->tableView_Elenco->show();
                
                    // TABLEVIEW PIANO
                    //QStandardItemModel *model = new QStandardItemModel(7,6,this); //Rows,Columns
                    OverwriteModel *model = new OverwriteModel(7,6,this);
                    //INTESTAZIONE COLONNE
                    model->setHorizontalHeaderItem(0, new QStandardItem(QString("MACCHINA")));
                    model->setHorizontalHeaderItem(1, new QStandardItem(QString("1")));
                    model->setHorizontalHeaderItem(2, new QStandardItem(QString("2")));
                    model->setHorizontalHeaderItem(3, new QStandardItem(QString("3")));
                    model->setHorizontalHeaderItem(4, new QStandardItem(QString("4")));
                    model->setHorizontalHeaderItem(5, new QStandardItem(QString("5")));
                    model->setHorizontalHeaderItem(6, new QStandardItem(QString("6")));
                    // MACCHINE
                    model->setItem(0,0,new QStandardItem(QString("PRESSA T63")));
                    model->setItem(1,0,new QStandardItem(QString("PRESSA T100")));
                    model->setItem(2,0,new QStandardItem(QString("PRESSA T160")));
                    model->setItem(3,0,new QStandardItem(QString("PRESSA T199")));
                    model->setItem(4,0,new QStandardItem(QString("PRESSA T200")));
                    model->setItem(5,0,new QStandardItem(QString("PRESSA T201")));
                    model->setItem(6,0,new QStandardItem(QString("TRAPANI")));
                    model->setItem(7,0,new QStandardItem(QString("OMERA/PIEGAT")));
                    model->setItem(8,0,new QStandardItem(QString("CARTATRICE")));
                    model->setItem(9,0,new QStandardItem(QString("TRONCA/CNC")));
                    model->setItem(10,0,new QStandardItem(QString("PUNT/MONTA")));
                    model->setItem(11,0,new QStandardItem(QString("SALDATRICI")));
                    model->setItem(12,0,new QStandardItem(QString("ROBOT")));
                    ui->tableView_Piano->horizontalHeader()->setSectionsClickable(1);
                    ui->tableView_Piano->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
                    ui->tableView_Piano->setModel(model);
                    ui->tableView_Elenco->setDragDropMode(QAbstractItemView::DropOnly);
                
                

                but don't works.. when i try to drag text.. nothing happen..
                i don't understand where is the problem..
                Any help?

                1 Reply Last reply
                0
                • SGaistS SGaist

                  Hi,

                  Why are you trying to implement drag and drop in the dialog rather than the view itself ?

                  TheCipo76T Offline
                  TheCipo76T Offline
                  TheCipo76
                  wrote on last edited by TheCipo76
                  #12

                  @SGaist Hi, i have tried the VRonin solution but i'm not able to use it in a dialog.. (in mainwindow works very well!)

                  can you tell me how can i implement drag and drop in the view as you suggested??
                  or is the same way??

                  1 Reply Last reply
                  0
                  • VRoninV Offline
                    VRoninV Offline
                    VRonin
                    wrote on last edited by
                    #13

                    Works perfectly in a dialog as well:

                    #include <QApplication>
                    #include <QMimeData>
                    #include <QStandardItemModel>
                    #include <QTableView>
                    #include <QSqlDatabase>
                    #include <QSqlQuery>
                    #include <QSqlTableModel>
                    #include <QHBoxLayout>
                    #include <QDialog>
                    #include <QTimer>
                    
                    class DragSqlTableModel : public QSqlTableModel{
                        Q_DISABLE_COPY(DragSqlTableModel)
                    public:
                        using  QSqlTableModel::QSqlTableModel;
                        Qt::ItemFlags flags(const QModelIndex &index) const override {return QSqlTableModel::flags(index) | Qt::ItemIsDragEnabled;}
                    
                    };
                    class OverwriteModel : public QStandardItemModel{
                        Q_DISABLE_COPY(OverwriteModel)
                    public:
                        using QStandardItemModel::QStandardItemModel;
                        bool dropMimeData(const QMimeData *data, Qt::DropAction,
                                             int, int, const QModelIndex &parent)  override
                        {
                            const QByteArray mimeData = data->data("application/x-qabstractitemmodeldatalist");
                                QDataStream mimeReader(mimeData);
                                int junk;
                                QMap<int,QVariant> modelData;
                                for(;;){
                                    mimeReader.startTransaction();
                                    mimeReader >> junk >> junk >> modelData;
                                    if(!mimeReader.commitTransaction())
                                        break;
                                    setItemData(parent,modelData);
                                }
                            return true;
                        }
                    };
                    
                    int main(int argc, char **argv) {
                        QApplication app(argc,argv);
                        QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
                           db.setDatabaseName(":memory:");
                       if (!db.open()) return 1;
                       QSqlQuery query;
                       Q_ASSUME(query.exec("create table person (id int primary key, "
                                     "firstname varchar(20), lastname varchar(20))"));
                          Q_ASSUME(query.exec("insert into person values(101, 'Danny', 'Young')"));
                          Q_ASSUME(query.exec("insert into person values(102, 'Christine', 'Holand')"));
                          Q_ASSUME(query.exec("insert into person values(103, 'Lars', 'Gordon')"));
                          Q_ASSUME(query.exec("insert into person values(104, 'Roberto', 'Robitaille')"));
                          Q_ASSUME(query.exec("insert into person values(105, 'Maria', 'Papadopoulos')"));
                        OverwriteModel destination(3,2);
                    
                        DragSqlTableModel source(nullptr,db);
                        source.setTable("person");
                        source.select();
                        QWidget mainWid;
                        QDialog* subDialog = new QDialog(&mainWid);
                        auto sourceView=new QTableView(subDialog);
                        sourceView->setDragEnabled(true);
                        sourceView->setModel(&source);
                        auto destinationView=new QTableView(subDialog);
                        destinationView->setModel(&destination);
                        destinationView->setDragDropMode(QAbstractItemView::DropOnly);
                        QHBoxLayout* mainLay = new QHBoxLayout(subDialog);
                        mainLay->addWidget(destinationView);
                        mainLay->addWidget(sourceView);
                        mainWid.show();
                        QTimer::singleShot(1000,subDialog,&QDialog::exec);
                        return app.exec();
                    }
                    

                    "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                    ~Napoleon Bonaparte

                    On a crusade to banish setIndexWidget() from the holy land of Qt

                    TheCipo76T 1 Reply Last reply
                    4
                    • VRoninV VRonin

                      Works perfectly in a dialog as well:

                      #include <QApplication>
                      #include <QMimeData>
                      #include <QStandardItemModel>
                      #include <QTableView>
                      #include <QSqlDatabase>
                      #include <QSqlQuery>
                      #include <QSqlTableModel>
                      #include <QHBoxLayout>
                      #include <QDialog>
                      #include <QTimer>
                      
                      class DragSqlTableModel : public QSqlTableModel{
                          Q_DISABLE_COPY(DragSqlTableModel)
                      public:
                          using  QSqlTableModel::QSqlTableModel;
                          Qt::ItemFlags flags(const QModelIndex &index) const override {return QSqlTableModel::flags(index) | Qt::ItemIsDragEnabled;}
                      
                      };
                      class OverwriteModel : public QStandardItemModel{
                          Q_DISABLE_COPY(OverwriteModel)
                      public:
                          using QStandardItemModel::QStandardItemModel;
                          bool dropMimeData(const QMimeData *data, Qt::DropAction,
                                               int, int, const QModelIndex &parent)  override
                          {
                              const QByteArray mimeData = data->data("application/x-qabstractitemmodeldatalist");
                                  QDataStream mimeReader(mimeData);
                                  int junk;
                                  QMap<int,QVariant> modelData;
                                  for(;;){
                                      mimeReader.startTransaction();
                                      mimeReader >> junk >> junk >> modelData;
                                      if(!mimeReader.commitTransaction())
                                          break;
                                      setItemData(parent,modelData);
                                  }
                              return true;
                          }
                      };
                      
                      int main(int argc, char **argv) {
                          QApplication app(argc,argv);
                          QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
                             db.setDatabaseName(":memory:");
                         if (!db.open()) return 1;
                         QSqlQuery query;
                         Q_ASSUME(query.exec("create table person (id int primary key, "
                                       "firstname varchar(20), lastname varchar(20))"));
                            Q_ASSUME(query.exec("insert into person values(101, 'Danny', 'Young')"));
                            Q_ASSUME(query.exec("insert into person values(102, 'Christine', 'Holand')"));
                            Q_ASSUME(query.exec("insert into person values(103, 'Lars', 'Gordon')"));
                            Q_ASSUME(query.exec("insert into person values(104, 'Roberto', 'Robitaille')"));
                            Q_ASSUME(query.exec("insert into person values(105, 'Maria', 'Papadopoulos')"));
                          OverwriteModel destination(3,2);
                      
                          DragSqlTableModel source(nullptr,db);
                          source.setTable("person");
                          source.select();
                          QWidget mainWid;
                          QDialog* subDialog = new QDialog(&mainWid);
                          auto sourceView=new QTableView(subDialog);
                          sourceView->setDragEnabled(true);
                          sourceView->setModel(&source);
                          auto destinationView=new QTableView(subDialog);
                          destinationView->setModel(&destination);
                          destinationView->setDragDropMode(QAbstractItemView::DropOnly);
                          QHBoxLayout* mainLay = new QHBoxLayout(subDialog);
                          mainLay->addWidget(destinationView);
                          mainLay->addWidget(sourceView);
                          mainWid.show();
                          QTimer::singleShot(1000,subDialog,&QDialog::exec);
                          return app.exec();
                      }
                      
                      TheCipo76T Offline
                      TheCipo76T Offline
                      TheCipo76
                      wrote on last edited by
                      #14

                      @VRonin You're right!
                      i've put your code in new project's main.cpp and works

                      however i 've wrote that i'm not able to use it..
                      not that your code don't work.

                      Now i will retry to use it in my project.

                      Thank you and thanks to all others who help me every time.

                      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