Инструменты пользователя

Инструменты сайта


develop:qt:model-view

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
develop:qt:model-view [2021/11/03 07:24]
admin
develop:qt:model-view [2021/11/18 05:32] (текущий)
admin
Строка 40: Строка 40:
 <details> <details>
 <summary> :!: Простая таблица, минимум функций+ вставка/удаление строк/столбцов </summary> <summary> :!: Простая таблица, минимум функций+ вставка/удаление строк/столбцов </summary>
 +:?: В ф-ции **beginInsertColumn**/**beginInsertRow**, нужно передавать корректные индексы, если передавать нули, то происходит вставка только одной записи, если не корректные цифры то все вообще по п*зде идет.\\
 +:?: Вставлять элементы можно как сразу в объект хранения (вектор/лист) так и ф-ями **insertColumn**/**insertRow**.\\
 +
 +
 <code cpp-qt> <code cpp-qt>
-class myTableModel;+class VectorTableModel;
  
 class MWin : public QMainWindow class MWin : public QMainWindow
Строка 47: Строка 51:
     Q_OBJECT     Q_OBJECT
  
-    myTableModel *VModelTab;+    VectorTableModel *VModelTab;
     QTableView *VViewTab;     QTableView *VViewTab;
     QLineEdit *editDataForWrite;     QLineEdit *editDataForWrite;
Строка 63: Строка 67:
  
  
-class myTableModel: public QAbstractTableModel+class VectorTableModel: public QAbstractTableModel
 { {
     Q_OBJECT     Q_OBJECT
  
-    QList<QList<QString> *> myDataInCell+    QVector<QVector<QString> *> *LisIsData
-    // Независимый список столбцов плох тем что при удалении,  +    QVector<QString*HeadersList;
-        // содержимое таблицы ведь не удаляется +
-    QList<QString *> ListHeaders;+
  
 public: public:
-    myTableModel(QObject *parent= nullptr); +    VectorTableModel(QObject *parent= nullptr); 
- +    ~VectorTableModel(); 
-    // Минимальные ф-ии+     
 +    // Минимальные
     QVariant data(const QModelIndex &index, int role= Qt::DisplayRole) const;     QVariant data(const QModelIndex &index, int role= Qt::DisplayRole) const;
     int rowCount(const QModelIndex &parent= QModelIndex()) const;     int rowCount(const QModelIndex &parent= QModelIndex()) const;
     int columnCount(const QModelIndex &parent= QModelIndex()) const;     int columnCount(const QModelIndex &parent= QModelIndex()) const;
 +    
     // Переопределенные     // Переопределенные
     QVariant headerData(int section, Qt::Orientation orientation, int role) const;     QVariant headerData(int section, Qt::Orientation orientation, int role) const;
     bool setData(const QModelIndex &index, const QVariant &value, int role);     bool setData(const QModelIndex &index, const QVariant &value, int role);
 +    
 +    // Собственные
 +    void addRow(const QVector<QString> &vValues);
 +    void addColumn(qint32 vCount);
 +    void delRow(const qint32 &vNumberRow);
 +    void delColumn(const qint32 &vNumberCol);
  
-    // Собственные 
-    void addDataRow(const QList<QString> &vValues); 
-    void addColumn(const QString&); 
-    void delRow(qint32 NumberRow); 
-    void delColumn(qint32 NumberCol); 
 }; };
 </code> </code>
Строка 94: Строка 98:
 <code cpp-qt> <code cpp-qt>
 #include "mwin.h" #include "mwin.h"
- 
  
 MWin::MWin(QWidget *parent): QMainWindow(parent) MWin::MWin(QWidget *parent): QMainWindow(parent)
 { {
-    VModelTab= new myTableModel(this);+    VModelTab= new VectorTableModel(this);
     VViewTab= new QTableView(this);     VViewTab= new QTableView(this);
     VViewTab->setModel(VModelTab);     VViewTab->setModel(VModelTab);
Строка 126: Строка 129:
     myWindow->setLayout(layMain);     myWindow->setLayout(layMain);
     setCentralWidget(myWindow);     setCentralWidget(myWindow);
- 
  
     connect(butAddRecord, &QPushButton::clicked, this, &MWin::slotInsertNewRecord);     connect(butAddRecord, &QPushButton::clicked, this, &MWin::slotInsertNewRecord);
Строка 153: Строка 155:
     if(editDataForWrite->text().isEmpty())     if(editDataForWrite->text().isEmpty())
     {     {
-        QMessageBox::information(this, "Text", "Please input text");+        QMessageBox::information(this, "Text", "Please input count");
         return;         return;
     }     }
-    VModelTab->addColumn(editDataForWrite->text());+    VModelTab->addColumn(editDataForWrite->text().toInt());
     editDataForWrite->clear();     editDataForWrite->clear();
     editDataForWrite->setFocus();     editDataForWrite->setFocus();
Строка 177: Строка 179:
 //*********************************************************************| //*********************************************************************|
  
-myTableModel::myTableModel(QObject *parent): QAbstractTableModel(parent)+VectorTableModel::VectorTableModel(QObject *parent): QAbstractTableModel(parent)
 { {
 +    LisIsData= new QVector<QVector<QString>* >; 
 +    HeadersList= new QVector<QString>;
 } }
  
-// QList->value()- проверяет границы; ->at()- быстрее но не проверяет границы + 
-// []- создает копию списка, если он является общим во время обращения, полезно для редактирования +VectorTableModel::~VectorTableModel()
-QVariant myTableModel::data(const QModelIndex &index, int roleconst+
 { {
-    if(role== Qt::DisplayRole) // || (==Qt::EditRole)|| (==Qt::BackgroundRole+    while(!LisIsData->isEmpty()) 
-        return myDataInCell.value(index.row())->value(index.column()); +        delete LisIsData->takeFirst(); 
-    return QVariant();+ 
 +    delete LisIsData; 
 +    delete HeadersList;
 } }
  
  
-int myTableModel::columnCount(const QModelIndex &parent) const+QVariant VectorTableModel::data(const QModelIndex &index, int role) const
 { {
-    Q_UNUSED(parent); // Просто чтобы не было варнинга о неиспользуемой переменной +    if(role== Qt::DisplayRole) 
-    return ListHeaders.count();+        return LisIsData->at(index.row())->at(index.column()); 
 +    return QVariant();
 } }
  
  
-int myTableModel::rowCount(const QModelIndex &parent) const+int VectorTableModel::rowCount(const QModelIndex &parent) const
 { {
     Q_UNUSED(parent);     Q_UNUSED(parent);
-    return myDataInCell.count();+    return LisIsData->count();
 } }
  
  
-void myTableModel::addDataRow(const QList<QString> &vValues)+int VectorTableModel::columnCount(const QModelIndex &parentconst
 { {
-    // Единственное только с цифрами тут: вообще это координаты новых строк,  +    Q_UNUSED(parent); 
-      // вставляем мы тут по одной, хз, с нолями работает, с некоторыми значениями не работает +    return LisIsData->isEmpty() 0:LisIsData->at(0)->count();
-    this->beginInsertRows(QModelIndex()0, 0); +
-    myDataInCell.append(new QList<QString>(vValues)); +
-    this->endInsertRows();+
 } }
  
  
-QVariant myTableModel::headerData(int section, Qt::Orientation orientation, int role) const+QVariant VectorTableModel::headerData(int section, Qt::Orientation orientation, int role) const
 { {
-    if(role != Qt::DisplayRole)+    if(role!= Qt::DisplayRole)
         return QVariant();         return QVariant();
-    if(orientation == Qt::Horizontal) + 
-        return *ListHeaders.value(section);+    if(orientation== Qt::Horizontal) 
 +        return HeadersList->count() > section ? HeadersList->at(section):"";
     else     else
-        return QString::number(section +1); // номера строк+        return QString::number(section +1);
 } }
  
  
-void myTableModel::addColumn(const QString &vNameNewCol)+bool VectorTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
 { {
-    this->beginInsertColumns(QModelIndex(), 0, 0); +    if(index.isValid() && role== Qt::EditRole
-    ListHeaders.append(new QString(vNameNewCol)); +    
-    this->endInsertColumns();+        LisIsData->at(index.row())->replace(index.column(), value.toString()); 
 +        emit dataChanged(index, index)
 +        return true; 
 +    } 
 + 
 +    return false;
 } }
  
  
-void myTableModel::delRow(qint32 NumberRow)+ 
 +void VectorTableModel::addRow(const QVector<QString> &vValues)
 { {
-    this->beginRemoveRows(QModelIndex(), 0,0); +    beginInsertRows(QModelIndex(), rowCount()rowCount()); 
-    delete myDataInCell.value(NumberRow); // Освобождение ячейки памяти +    QVector<QString> *vNewRow= new QVector<QString>(vValues); 
-    myDataInCell.removeAt(NumberRow); // Удаление ссылки на нее из списка + 
-    this->endRemoveRows();+    // Подгоняем кол-во столбцов, к большему, либо в гриде екторе) либо в новой строке 
 +    if(columnCount() > vNewRow->count()) 
 +        vNewRow->resize(this->columnCount()); 
 + 
 +    else if(columnCount() < vNewRow->count()) 
 +    { 
 +        beginInsertColumns(QModelIndex(), columnCount(), columnCount()+ (vNewRow->count()- columnCount()) -1); 
 + 
 +        for(qint32 i= 0; i < LisIsData->count(); i++) 
 +            LisIsData->at(i)->resize(vNewRow->count()); 
 + 
 +        endInsertColumns(); 
 +    } 
 + 
 +    LisIsData->append(vNewRow); 
 +    endInsertRows();
 } }
  
  
-void myTableModel::delColumn(qint32 NumberCol)+void VectorTableModel::addColumn(qint32 vCount)
 { {
-    this->beginRemoveColumns(QModelIndex(), 0,0); +    beginInsertColumns(QModelIndex(), columnCount()columnCount()+ vCount -1); 
-    delete ListHeaders.value(NumberCol); +    while(vCount--
-    ListHeaders.removeAt(NumberCol); +        this->insertColumn(columnCount()); 
-    this->endRemoveColumns();+    endInsertColumns();
 } }
  
  
-// Еще не используется, нужна для редактирования записей +void VectorTableModel::delRow(const qint32 &vNumberRow)
-bool myTableModel::setData(const QModelIndex &index, const QVariant &value, int role)+
 { {
-    if(index.isValid() && role== Qt::EditRole+    beginInsertRows(QModelIndex(), vNumberRow, vNumberRow); 
-    +    if(LisIsData->count() > vNumberRow
-        // ??? Проверка границ списка ??? +        LisIsData->remove(vNumberRow); 
-        myDataInCell[index.row()]->replace(index.column(), value.toString()); +    endInsertRows()
-        emit dataChanged(index, index); +}
-        return true+
-    }+
  
-    return false;+ 
 +void VectorTableModel::delColumn(const qint32 &vNumberCol) 
 +
 +    beginInsertColumns(QModelIndex(), vNumberCol, vNumberCol); 
 +    if(HeadersList->count() > vNumberCol) 
 +        HeadersList->remove(vNumberCol); 
 + 
 +    for(qint32 i= 0; i < LisIsData->count(); i++) 
 +        LisIsData->at(i)->remove(vNumberCol); 
 +    endInsertColumns();
 } }
 </code> </code>
develop/qt/model-view.1635924261.txt.gz · Последнее изменение: 2021/11/03 07:24 — admin