ДК
Джон КофиJuly 11, 2020, 7:51 a.m.

Drug Drop problems

Drug & Drop, QMimeData, Qt, QSqlTableModel

Привет. Есть делегат QSqlTableModel, на основе которого сделал Drug Drop.
Проблема в том, что перетаскивание работает корректно только тогда, когда я отображаю первую колонку - ID, если её скрыть, то поля съезжают и вместо перенесения строки отрабатывает вставка пустой, а копируемые данные меняются полями, иногда строку переносит нормально, но поля съезжают всё-равно.
Вот я и разбираюсь теперь в отладчике. Возникают вопросы, ответы на которые не нашел:
1)QMimeData копирует только отображенную информацию или также и из скрытых колонок? Просто в отладчике, что вижу: если отображенные поля есть все,
то имею все данные отображенных полей, данные одного скрытого, а еще данные от 2 скрытых нет.
Конкретно про колонку с ID, если я отображаю колонку с ID, то вижу, что данные с неё заносятся в QMimeData, если скрываю её, то этот ID в QMimeData не заносится.
2)Где можно почитать про ВСЕ форматы данных для QMimeData?
Я использую "application/x-qabstractitemmodeldatalist", а какие еще есть? Просто в доке такого формата вообще не нашел, а именно с ним работает.

Сам делегат:

SqlTableModelDrAndDr::SqlTableModelDrAndDr(QObject *parent, QSqlDatabase db) :
    QSqlTableModel(parent, db)
{
}

Qt::DropActions SqlTableModelDrAndDr::supportedDropActions() const
{
    return Qt::CopyAction | Qt::MoveAction;
}

Qt::ItemFlags SqlTableModelDrAndDr::flags(const QModelIndex &index) const
{
    Qt::ItemFlags defaultFlags = QSqlTableModel::flags(index);

    if (index.isValid())
        return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | defaultFlags;
    else
        return Qt::ItemIsDropEnabled | defaultFlags;
}

QMimeData *SqlTableModelDrAndDr::mimeData(const QModelIndexList &indexes) const
{
    QMimeData *mimeData = new QMimeData();
    QByteArray encodedData;

    QDataStream stream(&encodedData, QIODevice::WriteOnly);

    stream << indexes[0].row();

    foreach (const QModelIndex &index, indexes) {
        if (index.isValid()) {
            QString text = data(index, Qt::DisplayRole).toString();
            stream << text;
        }
    }

    mimeData->setData("application/x-qabstractitemmodeldatalist", encodedData);
    return mimeData;
}

bool SqlTableModelDrAndDr::canDropMimeData(const QMimeData *data,
    Qt::DropAction action, int row, int column, const QModelIndex &parent) const
{
    Q_UNUSED(action)
    Q_UNUSED(row)
    Q_UNUSED(column)
    Q_UNUSED(parent)

    if (!data->hasFormat("application/x-qabstractitemmodeldatalist"))
        return false;

    return true;
}

bool SqlTableModelDrAndDr::dropMimeData(const QMimeData *data,
      Qt::DropAction action, int row, int column, const QModelIndex &parent)
{
    if (!canDropMimeData(data, action, row, column, parent))
        return false;

    if (action == Qt::IgnoreAction)
        return true;

    int beginRow;

    if (row != -1)
        beginRow = row;
    else if (parent.isValid())
        beginRow = parent.row();
    else
        beginRow = rowCount(QModelIndex());

    QByteArray encodedData = data->data("application/x-qabstractitemmodeldatalist");
    QDataStream stream(&encodedData, QIODevice::ReadOnly);
    QStringList newItems;

    int r;
    stream >> r;

    while (!stream.atEnd()) {
        QString text;
        stream >> text;
        newItems << text;
    }

    removeRow(r, QModelIndex());
    submitAll();
    if (beginRow > r)
        --beginRow;

    _finishRow = beginRow;
    insertRow(beginRow, QModelIndex());
    int i = 0;
    foreach (const QString &text, newItems) {
        QModelIndex idx = index(beginRow, i++, QModelIndex());
        setData(idx, text);
    }

    return true;
}

Настройки вью и модели:

_reportsSQL->setSort(ReportDataBase::WEIGHT, Qt::SortOrder::AscendingOrder);
ui->_reportsTableView->setEditTriggers(QTableView::NoEditTriggers);
ui->_reportsTableView->setModel(_reportsSQL);
/*
 * Установказа заголовков
 * */
for (int i = 0, j = 0; i < _reportsSQL->columnCount(); ++i, ++j)
{
    _reportsSQL->setHeaderData(i, Qt::Horizontal, REPORTDATABASE->header(j).toUpper());
}

if(!_roles.contains(Models::UserRole::ROLES::ADMIN))
    ui->_reportsTableView->setColumnHidden(ReportDataBase::PATH, true);
ui->_reportsTableView->setColumnHidden(ReportDataBase::ID,true);
ui->_reportsTableView->setColumnHidden(ReportDataBase::SERVER_ID,true);
ui->_reportsTableView->setColumnHidden(ReportDataBase::LAB_ID,true);
ui->_reportsTableView->setColumnHidden(ReportDataBase::WEIGHT, true);
ui->_reportsTableView->setItemDelegateForColumn(ReportDataBase::PATH, pathDelegate);
ui->_reportsTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->_reportsTableView->setSelectionMode(QAbstractItemView::SingleSelection);
ui->_reportsTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
ui->_reportsTableView->horizontalHeader()->setStretchLastSection(true);
ui->_reportsTableView->horizontalHeader()->moveSection(ReportDataBase::PATH, ReportDataBase::DESCRIPTION);
ui->_reportsTableView->verticalHeader()->hide();

/*
 * For drag and drop
 * */
ui->_reportsTableView->setDragDropMode(QAbstractItemView::DragDropMode::InternalMove);
ui->_reportsTableView->setDragEnabled(true);
ui->_reportsTableView->setAcceptDrops(true);
ui->_reportsTableView->setDropIndicatorShown(true);
ui->_reportsTableView->viewport()->setAcceptDrops(true);
ui->_reportsTableView->setDefaultDropAction(Qt::MoveAction);
ui->_reportsTableView->setDragDropOverwriteMode(false);
_reportsSQL->setEditStrategy(QSqlTableModel::OnManualSubmit);

В классе, управляющим QSqlDatabase, поля установлены верно, если бы это было не так, то, навреное, и на вью информация отображалась не в правильных колонках.

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

4
Evgenii Legotckoi
  • July 13, 2020, 3:49 a.m.

Добрый день.
mime data можно именовать как заблагоросудится. Просто есть стандартные типы данных, а есть кастомные. То есть разработчики сами решают как их называть.
Копирование со всех колонок скорее всего происходит из-за того, что у вас настроено построчное выделение.
По идее копировать должно только видимые поля, хотя при желании можно и переписать поведение. Но если учесть описание проблемы с первой колонкой и приложенный код, то становится ясно, что это ожидаемое поведение

В этом коде по логике забирается первая строка из QMimeData, если колонка скрыта, то естественно, что данные могут интерпретироваться как угодно. Может оказаться нужная строка, а может быть мусор.

    int r;
    stream >> r;

Так что тут нужно продумывать логику и решать, что конкретно вам нужно.

    ДК
    • July 13, 2020, 4:58 a.m.

    Доброе утро! спасибо за ответ! а как настраивается поведение, чтобы копировались все поля всегда? тогда и проблем не будет со скрытыми колонками. Я имею ввиду в делегате что-то переделывать с data надо или просто есть какой-то флаг под эту задачу?

      Evgenii Legotckoi
      • July 13, 2020, 5:14 a.m.
      • The answer was marked as a solution.

      Я думаю, что вам этот метод нужно переписывать

      QMimeData *SqlTableModelDrAndDr::mimeData(const QModelIndexList &indexes) const
      

      То есть доделывать недостающие индексы, например, и по ним забирать данные.

        ДК
        • July 13, 2020, 7:43 a.m.

        благодорю!

          Comments

          Only authorized users can post comments.
          Please, Log in or Sign up
          AD

          C ++ - Test 004. Pointers, Arrays and Loops

          • Result:50points,
          • Rating points-4
          m

          C ++ - Test 004. Pointers, Arrays and Loops

          • Result:80points,
          • Rating points4
          m

          C ++ - Test 004. Pointers, Arrays and Loops

          • Result:20points,
          • Rating points-10
          Last comments
          i
          innorwallNov. 14, 2024, 12:07 p.m.
          Circuit switching and packet data transmission networks Angioedema 1 priligy dapoxetine
          i
          innorwallNov. 14, 2024, 11:42 a.m.
          How to Copy Files in Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
          i
          innorwallNov. 14, 2024, 9:09 a.m.
          Qt/C++ - Tutorial 068. Hello World using the CMAKE build system in CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
          i
          innorwallNov. 14, 2024, 4:05 a.m.
          EVILEG-CORE. Using Google reCAPTCHA 2001; 98 29 34 priligy buy
          i
          innorwallNov. 14, 2024, 4 a.m.
          PyQt5 - Lesson 007. Works with QML QtQuick (Signals and slots) priligy 30mg Am J Obstet Gynecol 171 1488 505
          Now discuss on the forum
          i
          innorwallNov. 14, 2024, 3:39 a.m.
          добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
          i
          innorwallNov. 11, 2024, 10:55 a.m.
          Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
          9
          9AnonimOct. 25, 2024, 9:10 a.m.
          Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

          Follow us in social networks