Название: не работает 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 ) Этот сигнал связывать со слотом приложения, где будут доступны и эта модель и модель с теми данными, которые нужны для вставки в эту модель. Тогда модели друг о друге не знают, глобальных переменных нет но они могут использовать данные друг друга при необходимости.
|