crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Две модели в одном QTableView
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
madnessw Дата 4.4.2011, 3:37
  Собрать в одну модель не проблема но такой код поддерживать и сопровождать очень трудно и черевато ошибками у меня тогда получиться около 70-ти столбцов а так у меня все модели уже написаны просто хотелось бы собрать их в одну модель более простым способом
kunashir Дата 2.4.2011, 19:07
  Первое что приходи на ум - если данные могут быть отображены в одном представлении, может их можно свесит и в одной модели?
if (role == Qt::ItemIsEditable) - что-то мне кажется что роль называется Qt::EditRole.
madnessw Дата 1.4.2011, 10:01
  Всем привет!
Поставили передомной задачу отображение нескольких моделей в одном TableView
Количество строк в моделях одинаковое.
решил написать общую модель QBigModel

#include "qbigmodel.h"

QBigModel::QBigModel(shared_ptr<EstData> eData,QObject *parent)
    : QBaseModel(parent)
{
    ESSData = eData;
    LaD = new QLoadAndGenerationTableModel(eData,this);
    VM = new QVoltageTableModel(eData,this);
}

QBigModel::~QBigModel()
{

}

QVariant QBigModel::headerData( int section, Qt::Orientation orientation, int role ) const
{
    if (section<LaD->columnCount())
    {
        return LaD->headerData(section,orientation,role);
    } else
    {
        return VM->headerData(section-LaD->columnCount(),orientation,role);
    }
}

Qt::ItemFlags QBigModel::flags( const QModelIndex &index ) const
{
    if (index.column()<LaD->columnCount())
    {
        return LaD->flags(index);
    } else
    {
        return VM->flags(index);
    }
}

QModelIndex QBigModel::index( int row, int column, const QModelIndex &parent /*= QModelIndex()*/ ) const
{
    if (column<LaD->columnCount())
    {
        return LaD->index(row,column);
    } else
    {
        return VM->index(row,column-LaD->columnCount());
    }
}

QModelIndex QBigModel::parent( const QModelIndex &child ) const
{
    if (child.column()<LaD->columnCount())
    {
        return LaD->parent(child);
    } else
    {
        return VM->parent(child);
    }
}

int QBigModel::rowCount( const QModelIndex &parent /*= QModelIndex()*/ ) const
{
    return ESSData->NodeVklCount+1;
}

int QBigModel::columnCount( const QModelIndex &parent /*= QModelIndex()*/ ) const
{
    return VM->columnCount()+LaD->columnCount();
}

QVariant QBigModel::data( const QModelIndex &index, int role /*= Qt::DisplayRole*/ ) const
{
    if (index.column()<LaD->columnCount())
    {
        return LaD->data(index,role);
    } else
    {
        return VM->data(index,role);
    }
}

bool QBigModel::setData( const QModelIndex &index, const QVariant &value, int role /*= Qt::EditRole*/ ) const
{
    if (index.column()<LaD->columnCount())
    {
        return LaD->setData(index,value,role);
    } else
    {
        return VM->setData(index,value,role);
    }
}

Данные отображаются но не редактируются : Qt:editRole не отрабатывает - голову сломал не могу понять в чём дело причём в ообычной модели всё работает:
#include "qvoltagetablemodel.h"
#include <QStringList>
#include <QFont>
QVoltageTableModel::QVoltageTableModel(shared_ptr<EstData>  eData, QObject *parent)
    :QBaseModel(parent)
{
    ESSData = eData;
}

QVoltageTableModel::~QVoltageTableModel()
{
    
}

//Возвращает шапку таблицы
QVariant QVoltageTableModel::headerData(int section, Qt::Orientation orientation,
                                     int role) const
{
     if (role != Qt::DisplayRole)
         return QVariant();

    if (orientation == Qt::Horizontal)
    {
        switch (section)
        {
//         case 0: return tr("Number"); break;
//         case 1: return tr("Node name"); break;
        case 0:    return " ";break;
        case 1: return tr("U measured"); break;
        case 2: return tr("U estimated"); break;
        case 3:return tr("Angele U"); break;
        case 4: return tr("D[U]"); break;
        case 5: return tr("Error U"); break;
        }
    }
    return QString();
}

//Делаем некоторые колонки редактируемые
Qt::ItemFlags QVoltageTableModel::flags(const QModelIndex &index) const
{
     if (index.isValid())
         if ((index.column()==4)||(index.column()==0)||(index.column()==1))
         {
            return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
         } 
        else
         if ((index.column()==5)||(index.column()==3)||(index.column()==2)) 
         {
            return QAbstractItemModel::flags(index) | Qt::DisplayRole;
         }
    return Qt::ItemIsEnabled;
}


QModelIndex QVoltageTableModel::index(int row, int column,
                          const QModelIndex &parent) const
{
    return createIndex(row,column);
}
QModelIndex QVoltageTableModel::parent(const QModelIndex &child) const
{
    return QModelIndex();
}
int QVoltageTableModel::rowCount(const QModelIndex &parent) const
{
    if (ESSData->NodeVklCount<=0)
    {
        return 0;
    }
    return ESSData->NodeVklCount+1;
}
int QVoltageTableModel::columnCount(const QModelIndex &parent) const
{
    return 6;
}
QVariant QVoltageTableModel::data(const QModelIndex &index, int role) const
{
    //QVariant v = GetValue<double>(ESSData->D_U,ESSData->NL[index.row()]);
    if (role == Qt::DisplayRole)
    {
        switch (index.column())
        {
            
//             case 0: 
//                     {
//                         return GetValue(ESSData->NN,index.row()+1);
//                         break;
//                     }
//             case 1: 
//                 {
//                     return QString::fromStdString(ESSData->NodeName[index.row()+1]);
//                     break;
//                 }

            case 0: 
                {
                    
                        int sts = GetValue(ESSData->Status_U,index.row()+1).toInt();
                        //QString s =  statusToText(sts);
                        return statusToText(sts);
                        break;
                }

            case 1: 
                    {
                        int b = GetValue(ESSData->Status_U,index.row()+1).toInt()&tm_NotIdentTM;
                        if (b!=0)
                        {
                            return QVariant("");
                        }
                        b = GetValue(ESSData->Status_U,index.row()+1).toInt()&tm_Manual;
                        if (b==0)    
                            return GetValue(ESSData->U_meas,index.row()+1); 
                        else 
                            return GetValue(ESSData->U_man,index.row()+1); 
                        break;
                    }
            case 2: 
                {
                    return GetValue(ESSData->U_est,index.row()+1); 
                    break;
                }
            case 3: 
                {
                    return GetValue(ESSData->AngleU_est,index.row()+1); 
                    break;
                }
            case 4: 
                    {
                        return GetValue(ESSData->D_U,index.row()+1); 
                        break;
                    }
            case 5: 
                    {
                        return GetValue(ESSData->Error_U,index.row()+1);
                        break;
                    }
        }

    }
    
      if (role == Qt::ItemIsEditable)
      {
        switch (index.column())
        {
        case 0:
            {
                    unsigned int sts = GetValue(ESSData->Status_U,index.row()+1).toUInt();
                    return GetValue(ESSData->Status_U,index.row()+1).toUInt();
                    break;
            }
        case 1: 
            {
                int b = GetValue(ESSData->Status_U,index.row()+1).toInt()&tm_NotIdentTM;
                if (b!=0)
                {
                    return QVariant("");
                }
                b = GetValue(ESSData->Status_U,index.row()+1).toInt()&tm_Manual;
                if (b==0)    
                    return GetValue(ESSData->U_meas,index.row()+1); 
                else 
                    return GetValue(ESSData->U_man,index.row()+1); 
                break;
            }
        case 4: 
            {
                return GetValue(ESSData->D_U,index.row()+1); 
                break;
            }
        }

    }

    if (role == Qt::TextColorRole)
    {
        if (GetValue(ESSData->BranState,index.row()+1).toInt()!=BRAN_STATE_ON)
        {
            return QColor(Qt::lightGray);
        }
        switch (index.column())
        {
        case 1:
            {
                QString sts = statusToText(GetValue(ESSData->Status_U,index.row()+1).toInt());
                return getStatusTextColor(sts);
                break;
            }
        }
    }
    if (role == Qt::FontRole)
    {
        if (GetValue(ESSData->BranState,index.row()+1).toInt()!=BRAN_STATE_ON)
        {
            QFont font;
            font.setBold(true);
            return font;
        }

        switch (index.column())
        {
        case 1:
            {
                QString sts = statusToText(GetValue(ESSData->Status_U,index.row()+1).toInt());
                if ((sts=="N")||(sts=="#"))
                {
                    QFont font;
                    font.setBold(true);
                    return font;
                }
                break;
            }
        }
    }
    return QVariant();
        
}

bool QVoltageTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    
    if (index.isValid() && role ==Qt::EditRole)
    {
        switch (index.column())
        {
        case 0:{
                    //int sts = textToStatus(index.data().toString(),GetValue(ESSData->Status_U,index.row()+1).toInt());
                    setValue(ESSData->Status_U,index.row()+1,value.toUInt()); 
                    emit dataChanged(index, index);
                    return true;
                    break;
               }
        case 1: 
            {
                int sts = GetValue(ESSData->Status_U,index.row()+1).toInt();
                sts&=tm_NotEstManualFlags;
                sts=sts|tm_Manual;
                setValue(ESSData->Status_U,index.row()+1,sts);
                setValue(ESSData->U_man,index.row()+1,value);
                emit dataChanged(index, index);
                return true;
                break;
            }
        case 4:{
                    setValue(ESSData->D_U,index.row()+1,value); 
                    emit dataChanged(index, index);
                    return true;
                    break;
               }
        }
    }
    return false;
}


Почему роль редактирования не отрабатывает?))
Ну или кто подскажет как проще такое зделать)
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 11.7.2025, 10:40