qt пользовательский класс в QTreeView - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть собственный класс с именем A, который в основном состоит из вектора типа B, где B - это закрытый класс внутри A.

class A{
public:

explicit A(std::string name): name_{name} {}

void add_item(int i, double d, std::string s){
    list_.emplace_back(i, d, s);
}

private:

    class B{
    public:

        B(int i, double d, std::string s): i_{i}, d_{d}, s_{s} {}

    private:
        int i_;
        double d_;
        std::string s_;
    }

    std::string name_;
    std::vector<B> list_;
}

Этот класс из другого проекта, который никоим образом не использует QT. Также невозможно включить некоторые заголовки QT в этот файл класса.

Моя цель - каким-то образом подключить объект типа A к QTableView. Цель состоит в том, чтобы в QTableView было столько строк, сколько есть элементов в list и 3 столбцах, где первый перечисляет значения целых чисел (i_), а второй значения двойников (* 1013). *) и третье значения из строк (s_).

Должна быть возможность отредактировать значения в QTreeView, и он должен автоматически добавить строку, если я вызову add_item().

Я не совсем уверен, как начать здесь. Я много использовал QTableViews, но только с QStandardItemModel.

Конечно, я мог бы просто использовать QStandardItemModel и проанализировать значения в этой модели, но тогда мне нужно будет каждый раз преобразовывать его обратно в класс A, если я хочу использовать его в другой функции.

Буду признателен за любую помощь. Я уверен, что должен быть способ сделать это, но я не знаю, что искать. Если у вас есть полезная ссылка или ключевое слово для поиска в Google, дайте мне знать.

1 Ответ

0 голосов
/ 20 ноября 2018

Мое решение состояло в том, чтобы создать новый класс, производный от QAbstractTableModel и перегружающий функции

QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;

int rowCount(const QModelIndex &parent = QModelIndex()) const override;

int columnCount(const QModelIndex &parent = QModelIndex()) const override;

QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;

bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;

Qt::ItemFlags flags(const QModelIndex& index) const override;

bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;

bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;

Кроме того, мне пришлось создать пару дополнительных классов Delegate, которые наследуются от QItemDelegate и переопределяют следующие функции:

QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;

void setEditorData(QWidget *editor, const QModelIndex &index) const override;

void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;

void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...