Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
9 июля 2018 г. 3:11

Перенос данных из таблицы в таблицу/работа с ячейкой

Здравствуйте.

1. В своей программе переношу ячейки с помощью DragDrop из одной таблицы в другую. В первой таблице изначально 1 столбец и много строк, а во второй - пусто.
При переносе ячейки в пустое поле - переносится нормально. Также нормально переносится, если указать "пункт назначения" между уже имеющимися ячейками. Но если перекинуть на уже имеющуюся ячейку - в первой таблице значение удаляется, а во второй не появляется (да, мне нужно чтобы в первой таблице именно удалялось, т.е. не копия а перемещение).

Каким способом можно сделать так, чтобы при переносе на уже имеющуюся ячейку значение переносилось, а не просто исчезало из первой таблицы? Ну либо можно ли как-то сделать запрет переноса на уже имеющуюся ячейку.
Настройки таблиц ниже.
2. Как можно взаимодействовать с ячейкой?
Например, у меня есть 2 QStringList: в одном ID, в другом наименования (выведены в таблицу). Цель - выводить (например в lineEdit) ID по наименованию, которое вычисляется из ячейки. ID и наименования перечислены в синхронном порядке, вопрос только в том, как при клике на ячейку выдергивать из неё текущий текст.



4

Добрый день!

Касательно первого вопроса. Можно запретить перенос ячеек в уже существующие записи. Для этого нужно создать свою кастомную модель данных. Она должна будет быть наследована от той модели данных, которую вы установили изначально в QListView.
Полагаю, что это QStringListModel. И нужно будет переопределить метод flags, чтобы запрещать перенос ячеек в том случае, если пользователь навёл DragAndDrop действие на уже существующую запись. То есть в данном случае пользователю будет разрешено переносить объекты либо между строками, либо в пустую область.
Делается это так
CustomModel.h



#ifndef CUSTOMMODEL_H
#define CUSTOMMODEL_H

#include <QStringListModel>

class CustomModel : public QStringListModel
{
    Q_OBJECT
public:
    explicit CustomModel(QObject *parent = nullptr);

signals:

public slots:

    // QAbstractItemModel interface
public:
    virtual Qt::ItemFlags flags(const QModelIndex &index) const override;
};

#endif // CUSTOMMODEL_H

CusomModel.cpp

#include "CustomModel.h"

CustomModel::CustomModel(QObject *parent) : QStringListModel(parent)
{

}

Qt::ItemFlags CustomModel::flags(const QModelIndex &index) const
{
    Qt::ItemFlags flags = QStringListModel::flags(index);

    if (index.isValid())
    {
        flags &= (~Qt::ItemIsDropEnabled);
    }
    return flags;
}

Для Django рекомендую VDS-хостинг TIMEWEB

0

Что касается второго вопроса, то там нужно оперировать методами модели данных data и setData и извлекать данные с помощью QModelIndex при выделении строки в таблице.

Вот например в статье по работе с QDataWidgetMapper забираются данные через метод data с помощью QModelIndex

Для Django рекомендую VDS-хостинг TIMEWEB

0

Таблицы на основе QTableView. С ними таким же способом, или иначе?



0

С QTableView не проверял... но теоретически должно сработать.

По механике работы там идёт либо перемещение в свободную ячейку, либо замена содержимого. Данное переопределение метода flags позволяет запретить замену в ячейке, если целью является ячейка с валидным индексом.
Вопрос в том, как данные Вы будете позволять выделять при Drag And Drop действии. В данном случае во вьюшках нужно разрешить выделение построчно, а не по ячейкам. Тогда более менее корректно должно работать. В случае с ячейками потребуется более детальное тестирование и обработка событий. Да и для переноса полных данных строки нужно использовать именно построчное выделение.




Для Django рекомендую VDS-хостинг TIMEWEB

0

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
18 ноября 2018 г. 19:19
cyrillwork

Qt - Тест 001. Сигналы и слоты

  • Результат:78баллов,
  • Очки рейтинга2
16 ноября 2018 г. 19:09
Илья Завьялов

Qt - Тест 001. Сигналы и слоты

  • Результат:31баллов,
  • Очки рейтинга-10
16 ноября 2018 г. 12:49
Ирина Минигузина

C++ - Тест 003. Условия и циклы

  • Результат:0баллов,
  • Очки рейтинга-10
Последние комментарии
16 ноября 2018 г. 6:50
Евгений Легоцкой

Добрый день! шаблон не находит, или шаблон неправильно прописали, или тег шаблона неправильно написан, иных выводов сделать не могу, из того, что вы написали. трейсбек нужно смотреть. Со...
16 ноября 2018 г. 6:48
Евгений Легоцкой

пройтись циклом по всем виджетам в обратном порядке for (int i = ui->vertialLayout->count() - 1; i >= 0; --i){ QWidget* w = ui->verticalLyout->itemAt(i)->widget();...
15 ноября 2018 г. 21:35
chunk

Доброго времени суток Евгений. Не подскажете что я делаю не так? Получаю ошибку такого характера: Reverse for 'add_comment' with arguments '('',)' not found. 1 pattern(s) tried: ...
15 ноября 2018 г. 15:35
Михаиллл

Спасибо. Похоже где то описку сделал, поэтому не работало. Я добавил на verticalLayout много виджитов. А можно ли их как то быстро и просто удалить?
15 ноября 2018 г. 14:55
Евгений Легоцкой

verticalLayout - это, по-моему предположению, должен быть у вас объект класса QVBoxLayout, который наследован от QBoxLayout. Поэтому открываете документацию на QVBoxLayout ...
Сейчас обсуждают на форуме
18 ноября 2018 г. 18:11
Metelev

Большое спасибо, все получилось, завтра начну изучать код.
18 ноября 2018 г. 17:49
Чарльз Грин

Спасибо, буду разбераться
17 ноября 2018 г. 14:13
Чарльз Грин

Я сейчас занимаюсь мультимедией, это аудио и видео, программы для концертов и т. д. Бибилиотека Qt очень помогает, она надежная, а надежность в моих приложениях очень важный фактор чтоб не пол...
16 ноября 2018 г. 16:28
Евгений Легоцкой

Добрый день! Спасибо, что воспользовались именно форумом. Заниматься курсовыми работами чьими-то ни было у меня времени нет, у самого полторы работы. Но что-то подсказать на фо...
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы