Russian Qt Forum
Ноябрь 22, 2024, 09:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: не работает QAbstractTableModel::index()  (Прочитано 5056 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« : Февраль 02, 2017, 18:09 »

Пытаюсь с помощью функции
Код:
QAbstractTableModel::index
получить QModelIndex, но он получается пустой

Вот код:

Код
C++ (Qt)
class BaseDataTableModel : public QAbstractTableModel
{
   Q_OBJECT
 
public:
   explicit BaseDataTableModel(int name, QObject *parent = 0);
   virtual ~BaseDataTableModel();
 
   Qt::ItemFlags flags(const QModelIndex &index) const;
   int rowCount(const QModelIndex &parent) const;
   int columnCount(const QModelIndex &parent) const;
   virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
   QVariant headerData(int section, Qt::Orientation orientation, int role) const;
 
   ....
 
   virtual void prepareInsertData() = 0;
 
};
 
class TableModelCP_Device : public BaseDataTableModel
{
   Q_OBJECT
 
public:
   explicit TableModelCP_Device(int name, QObject *parent = 0);
   virtual ~TableModelCP_Device();
 
   ...
 
   virtual void prepareInsertData();
};
 
 
void TableModelCP_Device::prepareInsertData()
{
   qDebug()<<"TableModelCP_Device::prepareInsertData";
   //DEV_CODE
   int column_code_devices = 0; //номер колонки code в таблице DEVICES
   QModelIndex prKeyDevices = QAbstractTableModel::index(viewDevices->currentIndex().row(),column_code_devices);
   qDebug()<<"prKeyDevices = "<<prKeyDevices;
   QVariant code_devices = ((BaseDataTableModel*)(((DataBaseFilterModel*)(viewDevices->model()))->sourceModel()))->data(prKeyDevices);
   qDebug()<<"code_devices = "<<code_devices;
 
   //CP_CODE
   int column_code_cp = 0; //номер колонки code в таблице CONTROL_POINTS
   QModelIndex prKeyControlPoints = QAbstractTableModel::index(viewControlPoints->currentIndex().row(),column_code_cp);
   qDebug()<<"prKeyControlPoints = "<<prKeyControlPoints;
   QVariant code_cp = ((BaseDataTableModel*)(((DataBaseFilterModel*)(viewControlPoints->model()))->sourceModel()))->data(prKeyControlPoints);
   qDebug()<<"code_cp = "<<code_cp;
 
   //TO DO как в BaseDataTableModel::prepareInsertData()        
   int row = rowCount(QModelIndex());
   int amountColumn = columnCount(QModelIndex());
   beginInsertRows(QModelIndex(),row,row);
   QStringList * dataRecord = new QStringList;
   for(int i = 0; i < amountColumn; i++){
       if(i == 0){//первая колонка в таблице CP_DEVICE
           dataRecord->append(code_devices.toString());
       }
       else if(i == 1){//вторая колонка в таблице CP_CODE
           dataRecord->append(code_cp.toString());
       }
       else{
           dataRecord->append("");
       }
   }
   dataRecords.append(dataRecord);
   insertRecords.append(dataRecord);
   endInsertRows();
 
}
 

Код:
qDebug()<<"prKeyDevices = "<<prKeyDevices;
Выводит в консоль
Код:
QModelIndex(-1,-1,QObject(0x0))
Хотя
Код:
viewControlPoints->currentIndex()
работает норм.
Скажите, что я делаю некорректно Непонимающий

Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Февраль 02, 2017, 23:25 »

Ну навскдку надо бы проверить значение viewDevices->currentIndex()
А вообще, дичь какая-то, почему модель знает что-то про вьюху?
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #2 : Февраль 03, 2017, 10:04 »

Ну навскдку надо бы проверить значение viewDevices->currentIndex()
А вообще, дичь какая-то, почему модель знает что-то про вьюху?
1.
Код
C++ (Qt)
viewDevices->currentIndex()
 
работает, проверял.
2.
viewDevice это глобальная переменная.
а нужно это чтобы при вставке row,брались значения данных из другой таблицы.
Код
C++ (Qt)
QModelIndex prKeyDevices = QAbstractTableModel::index(viewDevices->currentIndex().row(),column_code_devices);
qDebug()<<"prKeyDevices = "<<prKeyDevices;
QVariant code_devices = ((BaseDataTableModel*)(((DataBaseFilterModel*)(viewDevices->model()))->sourceModel()))->data(prKeyDevices);
 
« Последнее редактирование: Февраль 03, 2017, 10:10 от demaker » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Февраль 03, 2017, 12:49 »

Ну TableModel::index возвращает невалидный индекс только в том случае, если ряд и колонка вне модели:
Код:
QModelIndex QAbstractTableModel::index(int row, int column, const QModelIndex &parent) const
{
    return hasIndex(row, column, parent) ? createIndex(row, column) : QModelIndex();
}
Проверяйте ров и колумн.
А так, архитектура очень кривая, глобалная переменная, то, что модель знает про вьюху и то, что она знает тип другой модели - дичь.
Связь между моделями надо делать извне, в гуйне, содержащей модель и вид.
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #4 : Февраль 03, 2017, 13:26 »

Ну TableModel::index возвращает невалидный индекс только в том случае, если ряд и колонка вне модели:
Код:
QModelIndex QAbstractTableModel::index(int row, int column, const QModelIndex &parent) const
{
    return hasIndex(row, column, parent) ? createIndex(row, column) : QModelIndex();
}
Проверяйте ров и колумн.
А так, архитектура очень кривая, глобалная переменная, то, что модель знает про вьюху и то, что она знает тип другой модели - дичь.
Связь между моделями надо делать извне, в гуйне, содержащей модель и вид.

Спасибо , учту Улыбающийся
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #5 : Февраль 03, 2017, 21:46 »

Вы можете в своей модели сделать сигнал beforeInsertRows( row, col, QVariant& data )
Этот сигнал связывать со слотом приложения, где будут доступны и эта модель и модель с теми данными, которые нужны для вставки в эту модель. Тогда модели друг о друге не знают, глобальных переменных нет но они могут использовать данные друг друга при необходимости.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.128 секунд. Запросов: 23.