Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Плагины и заполнение списка из них
Форум на CrossPlatform.RU > Курилка > Алгоритмы, задачи по программированию, логические игры
ViGOur
Есть GUI, в котором создается список с QTreeView, заполняется и показывается по правилам модель представление с базовыми параметрами (Account, name, number, ... ).
Есть два плагина, которые дополняют QTreeView из GUI своими столбцами и разумеется функционалом, данные обновляются благодаря механизму сигнал/слот.

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

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

Насколько я понял, есть некая модель, которая собственно обновляется данными от плагинов. Вот ее интерфейс я бы использовал при экспорте-импорте. Причем в нем ничего не должно менятся, только количество столбцов. Т.е. модель является некоей композицией моделей плагинов.
ViGOur
По идее я должен экспортировать только те данные, которые могут быть сопоставлены с подключенными плагинами.
Пока я сделал примерно так:
КОД
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
Да вроде бы все нормально выглядит. Единственное что только m_key бы сделать глобально-уникальным, например UUID, чтобы плагины не пересекались друг с другом.
Еще можно версии добавить и их проверять.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.