Russian Qt Forum

Qt => Model-View (MV) => Тема начата: demaker от Февраль 02, 2017, 18:09



Название: не работает QAbstractTableModel::index()
Отправлено: demaker от Февраль 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()
работает норм.
Скажите, что я делаю некорректно ???



Название: Re: не работает QAbstractTableModel::index()
Отправлено: Авварон от Февраль 02, 2017, 23:25
Ну навскдку надо бы проверить значение viewDevices->currentIndex()
А вообще, дичь какая-то, почему модель знает что-то про вьюху?


Название: Re: не работает QAbstractTableModel::index()
Отправлено: demaker от Февраль 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);
 


Название: Re: не работает QAbstractTableModel::index()
Отправлено: Авварон от Февраль 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();
}
Проверяйте ров и колумн.
А так, архитектура очень кривая, глобалная переменная, то, что модель знает про вьюху и то, что она знает тип другой модели - дичь.
Связь между моделями надо делать извне, в гуйне, содержащей модель и вид.


Название: Re: не работает QAbstractTableModel::index()
Отправлено: demaker от Февраль 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();
}
Проверяйте ров и колумн.
А так, архитектура очень кривая, глобалная переменная, то, что модель знает про вьюху и то, что она знает тип другой модели - дичь.
Связь между моделями надо делать извне, в гуйне, содержащей модель и вид.

Спасибо , учту :)


Название: Re: не работает QAbstractTableModel::index()
Отправлено: break от Февраль 03, 2017, 21:46
Вы можете в своей модели сделать сигнал beforeInsertRows( row, col, QVariant& data )
Этот сигнал связывать со слотом приложения, где будут доступны и эта модель и модель с теми данными, которые нужны для вставки в эту модель. Тогда модели друг о друге не знают, глобальных переменных нет но они могут использовать данные друг друга при необходимости.