Показаны различия между двумя версиями страницы.
Следующая версия | Предыдущая версия | ||
develop:qt:model-view [2021/11/01 04:03] admin создано |
develop:qt:model-view [2021/11/18 05:32] (текущий) admin |
||
---|---|---|---|
Строка 4: | Строка 4: | ||
===== Модель (данных) ===== | ===== Модель (данных) ===== | ||
+ | {{ : | ||
- | ==== ==== | + | Содержатся такие свойства как **index()**, |
+ | **DataRole**- содержит много разных вариантов ролей данных\\ | ||
+ | **ListModel**- простой, | ||
+ | **StandartItemModel**- гораздо более сложная структура, | ||
- | ==== ==== | + | Для использования, |
+ | Для хранения данных, | ||
+ | ==== QModelIndex ==== | ||
+ | Используется в качестве индекса в моделях, | ||
+ | Новые объекты создаются с помощью функции **QAbstractItemModel:: | ||
+ | |||
+ | Индексы относятся к элементам и содержат всю информацию, | ||
+ | **QAbstractItemModel:: | ||
+ | | bool **isValid()** | true если индекс принадлежит модели и имеет неотрицательные номера столбцов/ | ||
+ | | QModelIndex **sibling()** | возвращает " | ||
+ | | QVariant **data()** | возвращает данные для указанной роли | | ||
===== Представление (данных) ===== | ===== Представление (данных) ===== | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | В представлении содержатся функции рисования/ | ||
+ | |||
+ | |||
+ | ===== Примеры ===== | ||
+ | |||
+ | ==== Таблица ==== | ||
+ | |||
+ | < | ||
+ | < | ||
+ | :?: В ф-ции **beginInsertColumn**/ | ||
+ | :?: Вставлять элементы можно как сразу в объект хранения (вектор/ | ||
+ | |||
+ | |||
+ | <code cpp-qt> | ||
+ | class VectorTableModel; | ||
+ | |||
+ | class MWin : public QMainWindow | ||
+ | { | ||
+ | Q_OBJECT | ||
+ | |||
+ | VectorTableModel *VModelTab; | ||
+ | QTableView *VViewTab; | ||
+ | QLineEdit *editDataForWrite; | ||
+ | QPushButton *butAddRecord, | ||
+ | |||
+ | public: | ||
+ | MWin(QWidget *parent = nullptr); | ||
+ | |||
+ | public slots: | ||
+ | void slotInsertNewRecord(); | ||
+ | void slotInsertNewColumn(); | ||
+ | void slotDeleteSelectedRecord(); | ||
+ | void slotDeleteSelectedColumn(); | ||
+ | }; | ||
+ | |||
+ | |||
+ | class VectorTableModel: | ||
+ | { | ||
+ | Q_OBJECT | ||
+ | |||
+ | QVector< | ||
+ | QVector< | ||
+ | |||
+ | public: | ||
+ | VectorTableModel(QObject *parent= nullptr); | ||
+ | ~VectorTableModel(); | ||
+ | | ||
+ | // Минимальные | ||
+ | QVariant data(const QModelIndex &index, int role= Qt:: | ||
+ | int rowCount(const QModelIndex & | ||
+ | int columnCount(const QModelIndex & | ||
+ | | ||
+ | // Переопределенные | ||
+ | QVariant headerData(int section, Qt:: | ||
+ | bool setData(const QModelIndex &index, const QVariant &value, int role); | ||
+ | | ||
+ | // Собственные | ||
+ | void addRow(const QVector< | ||
+ | void addColumn(qint32 vCount); | ||
+ | void delRow(const qint32 & | ||
+ | void delColumn(const qint32 & | ||
+ | |||
+ | }; | ||
+ | </ | ||
+ | |||
+ | <code cpp-qt> | ||
+ | #include " | ||
+ | |||
+ | MWin:: | ||
+ | { | ||
+ | VModelTab= new VectorTableModel(this); | ||
+ | VViewTab= new QTableView(this); | ||
+ | VViewTab-> | ||
+ | VViewTab-> | ||
+ | |||
+ | editDataForWrite= new QLineEdit(this); | ||
+ | butAddRecord= new QPushButton(" | ||
+ | butAddColumn= new QPushButton(" | ||
+ | |||
+ | QHBoxLayout *layCtrls= new QHBoxLayout(); | ||
+ | layCtrls-> | ||
+ | layCtrls-> | ||
+ | layCtrls-> | ||
+ | |||
+ | butDelRecord= new QPushButton(" | ||
+ | butDelColumn= new QPushButton(" | ||
+ | QHBoxLayout *laySecondCtrls= new QHBoxLayout(); | ||
+ | laySecondCtrls-> | ||
+ | laySecondCtrls-> | ||
+ | |||
+ | QVBoxLayout *layMain= new QVBoxLayout(); | ||
+ | layMain-> | ||
+ | layMain-> | ||
+ | layMain-> | ||
+ | |||
+ | QWidget *myWindow= new QWidget(); | ||
+ | myWindow-> | ||
+ | setCentralWidget(myWindow); | ||
+ | |||
+ | connect(butAddRecord, | ||
+ | connect(butAddColumn, | ||
+ | connect(butDelRecord, | ||
+ | connect(butDelColumn, | ||
+ | } | ||
+ | |||
+ | |||
+ | void MWin:: | ||
+ | { | ||
+ | if(editDataForWrite-> | ||
+ | { | ||
+ | QMessageBox:: | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | VModelTab-> | ||
+ | editDataForWrite-> | ||
+ | editDataForWrite-> | ||
+ | } | ||
+ | |||
+ | |||
+ | void MWin:: | ||
+ | { | ||
+ | if(editDataForWrite-> | ||
+ | { | ||
+ | QMessageBox:: | ||
+ | return; | ||
+ | } | ||
+ | VModelTab-> | ||
+ | editDataForWrite-> | ||
+ | editDataForWrite-> | ||
+ | } | ||
+ | |||
+ | |||
+ | void MWin:: | ||
+ | { | ||
+ | VModelTab-> | ||
+ | } | ||
+ | |||
+ | |||
+ | void MWin:: | ||
+ | { | ||
+ | VModelTab-> | ||
+ | } | ||
+ | |||
+ | |||
+ | // | ||
+ | // | ||
+ | |||
+ | VectorTableModel:: | ||
+ | { | ||
+ | LisIsData= new QVector< | ||
+ | HeadersList= new QVector< | ||
+ | } | ||
+ | |||
+ | |||
+ | VectorTableModel:: | ||
+ | { | ||
+ | while(!LisIsData-> | ||
+ | delete LisIsData-> | ||
+ | |||
+ | delete LisIsData; | ||
+ | delete HeadersList; | ||
+ | } | ||
+ | |||
+ | |||
+ | QVariant VectorTableModel:: | ||
+ | { | ||
+ | if(role== Qt:: | ||
+ | return LisIsData-> | ||
+ | return QVariant(); | ||
+ | } | ||
+ | |||
+ | |||
+ | int VectorTableModel:: | ||
+ | { | ||
+ | Q_UNUSED(parent); | ||
+ | return LisIsData-> | ||
+ | } | ||
+ | |||
+ | |||
+ | int VectorTableModel:: | ||
+ | { | ||
+ | Q_UNUSED(parent); | ||
+ | return LisIsData-> | ||
+ | } | ||
+ | |||
+ | |||
+ | QVariant VectorTableModel:: | ||
+ | { | ||
+ | if(role!= Qt:: | ||
+ | return QVariant(); | ||
+ | |||
+ | if(orientation== Qt:: | ||
+ | return HeadersList-> | ||
+ | else | ||
+ | return QString:: | ||
+ | } | ||
+ | |||
+ | |||
+ | bool VectorTableModel:: | ||
+ | { | ||
+ | if(index.isValid() && role== Qt:: | ||
+ | { | ||
+ | LisIsData-> | ||
+ | emit dataChanged(index, | ||
+ | return true; | ||
+ | } | ||
+ | |||
+ | return false; | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | void VectorTableModel:: | ||
+ | { | ||
+ | beginInsertRows(QModelIndex(), | ||
+ | QVector< | ||
+ | |||
+ | // Подгоняем кол-во столбцов, | ||
+ | if(columnCount() > vNewRow-> | ||
+ | vNewRow-> | ||
+ | |||
+ | else if(columnCount() < vNewRow-> | ||
+ | { | ||
+ | beginInsertColumns(QModelIndex(), | ||
+ | |||
+ | for(qint32 i= 0; i < LisIsData-> | ||
+ | LisIsData-> | ||
+ | |||
+ | endInsertColumns(); | ||
+ | } | ||
+ | |||
+ | LisIsData-> | ||
+ | endInsertRows(); | ||
+ | } | ||
+ | |||
+ | |||
+ | void VectorTableModel:: | ||
+ | { | ||
+ | beginInsertColumns(QModelIndex(), | ||
+ | while(vCount--) | ||
+ | this-> | ||
+ | endInsertColumns(); | ||
+ | } | ||
+ | |||
+ | |||
+ | void VectorTableModel:: | ||
+ | { | ||
+ | beginInsertRows(QModelIndex(), | ||
+ | if(LisIsData-> | ||
+ | LisIsData-> | ||
+ | endInsertRows(); | ||
+ | } | ||
+ | |||
+ | |||
+ | void VectorTableModel:: | ||
+ | { | ||
+ | beginInsertColumns(QModelIndex(), | ||
+ | if(HeadersList-> | ||
+ | HeadersList-> | ||
+ | |||
+ | for(qint32 i= 0; i < LisIsData-> | ||
+ | LisIsData-> | ||
+ | endInsertColumns(); | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
- | ==== ==== | ||
- | ==== ==== | ||
- | ===== ===== | ||