crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Плагины и заполнение списка из них, реальная задачка
ViGOur
  опции профиля:
сообщение 1.7.2015, 17:27
Сообщение #1


Мастер
******

Группа: Модератор
Сообщений: 3291
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Есть GUI, в котором создается список с QTreeView, заполняется и показывается по правилам модель представление с базовыми параметрами (Account, name, number, ... ).
Есть два плагина, которые дополняют QTreeView из GUI своими столбцами и разумеется функционалом, данные обновляются благодаря механизму сигнал/слот.

Нужна возможность, например добавить механизм импорта/экспорта из данного QTreeView и предусматреть вариант, что импорт делался с подключенным плагином, а экспорт с отключенным и наоборот.

Интересен красивый и изящный алгоритм реализации описанного выше.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 3.7.2015, 21:21
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


А экспортироватся будут все данные?
Если плагин отключен при импорте, что происходит с данными, они теряются?
Вообще, поподробнее бы про экспорт-импорт.

Насколько я понял, есть некая модель, которая собственно обновляется данными от плагинов. Вот ее интерфейс я бы использовал при экспорте-импорте. Причем в нем ничего не должно менятся, только количество столбцов. Т.е. модель является некоей композицией моделей плагинов.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 6.7.2015, 11:07
Сообщение #3


Мастер
******

Группа: Модератор
Сообщений: 3291
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


По идее я должен экспортировать только те данные, которые могут быть сопоставлены с подключенными плагинами.
Пока я сделал примерно так:
КОД
class CAccountHeader
{
    int m_key;
    QVariant m_data;
    bool m_bResizeColumnToContents;

public:
    CAccountHeader(QVariant data, bool brctc=false):m_data(data), m_bResizeColumnToContents(brctc){}
    const QVariant &data()const{ return m_data; }
};

class CAccountCol
{
    std::map<int, QVariant> m_roleData;
    QVariant    m_data;

public:
    CAccountCol(QVariant data):m_data(data){}
    const QVariant &data()const{ return m_data; }
};

class CAccountHeaders : public std::vector<CAccountHeader>{};
class CAccount : public std::vector<CAccountCol>{};

class CAccounts : public std::vector<CAccount>
{
private:
    CAccountHeaders  m_headers;

public:
    void setHeader( const CAccountHeaders &header )
    {
        m_headers = header;
    }

    void addAccount( const CAccount &account )
    {
        this->push_back( account );
    }

    int headerSize()const { return m_headers.size(); }
};

class CHeaderBuilder
{
    std::vector<CHeaderBuilder*> m_builders;
public:
    CAccountHeaders build()
    {
        CAccountHeaders header;
        header.push_back( QVariant( "Сервер" ) );
        header.push_back( QVariant( "Пользователь" ) );
        header.push_back( QVariant( "Пароль" ) );

        for( size_t n = 0; n < m_builders.size(); ++n)
        {
            CHeaderBuilder *pBuilder = m_builders.at(n);
            if( pBuilder )
                pBuilder->build( &header);
        }
        return header;
    }

protected:
    virtual void build(CAccountHeaders *){}
};

class CAccountBuilder
{
    std::vector<CAccountBuilder*> m_builders;
public:
    CAccount build( const char *pServer, const char *pUser, const char *pPass)
    {
        CAccount account;
        account.push_back( QVariant( pServer ) );
        account.push_back( QVariant( pUser ) );
        account.push_back( QVariant( pPass ) );

        for( size_t n = 0; n < m_builders.size(); ++n)
        {
            CAccountBuilder *pBuilder = m_builders.at(n);
            if( pBuilder )
                pBuilder->build( &account);
        }

        return account;
    }

protected:
    virtual void build(CAccount *){}
};


Ну а в модели у меня создается объект:
CAccounts m_accounts;

который заполняется при запуске приложения после создания всех билдеров с учетом загруженных плагинов.

А CAccountHeader::m_key использую для сохранения данных, и он назначается в плагине и относится только к определенному плагину. Потому если какой-то плагин отключен, то при импорте столбцы из плагина не будут учитываться...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 7.7.2015, 16:44
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Да вроде бы все нормально выглядит. Единственное что только m_key бы сделать глобально-уникальным, например UUID, чтобы плагины не пересекались друг с другом.
Еще можно версии добавить и их проверять.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Ответить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.11.2019, 13:03