Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/34: Рейтинг темы: голосов - 34, средняя оценка - 4.71
11 / 11 / 3
Регистрация: 06.08.2011
Сообщений: 208
1

QAbstractTableModel

19.01.2017, 15:41. Показов 7004. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
Помогите разобраться как правильно использовать QAbstractTableModel

Пишу так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#ifndef TABLEMODEL_H
#define TABLEMODEL_H
#include <QAbstractItemModel>
#include <QVariant>
#include <QTableView>
#include <QSqlTableModel>
#include <QAbstractTableModel>
 
#include "connection.h"
 
 
class TableModel : public QAbstractTableModel{
private:
    int m_nRows;
    int m_nColumns;
    QSqlTableModel  model;
public:
    TableModel(int nRows, int nColumns, QObject* pobj = 0)
        : QAbstractTableModel(pobj)
    ,m_nRows(nRows)
    ,m_nColumns(nColumns){
 
}
 
};
 
#endif // TABLEMODEL_H
tablemodel.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
#include "tablemodel.h"
 
TableModel::TableModel()
{
    if (!createConnection())
        return 1;
 
    model.setTable("person");
    model.select();
}
main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <QApplication>
#include "tablemodel.h"
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    TableModel model(5,5);
    QTableView tableView;
    tableView.setModel(&model);
    tableView.show();
//    Widget w;
//    w.show();
 
    return a.exec();
}
Получаю ошибку:
error: cannot declare variable 'model' to be of abstract type 'TableModel'

Заранее спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.01.2017, 15:41
Ответы с готовыми решениями:

Разобраться QAbstractTableModel
Создаю класс qPartOrdersModel наследника QAbstractTableModel #ifndef PARTORDERMODEL_H #include...

QTableView и QAbstractTableModel
подскажите пожалуйста как заполнить простую таблицу используя эти инструменты, гугл не помог.

Сортировка в QAbstractTableModel
Пишу простенький файловый менеджер (для общего развития). Унаследовался от класса...

Наследование от QAbstractTableModel
Добрый день. Когда я создаю класс, который наследует QAbstractTableModel, сразу же появляется...

9
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
19.01.2017, 16:30 2
Цитата Сообщение от Ирина197708 Посмотреть сообщение
error: cannot declare variable 'model' to be of abstract type 'TableModel'
Имхо, в классе QAbstractTableModel есть чисто виртуальные функции. И их надо перегрузить в производном классе.

Добавлено через 10 минут
Эти чисто виртуальные функции могут быть определены в QAbstractItemModel, от которого QAbstractTableModel наследуется.
1
11 / 11 / 3
Регистрация: 06.08.2011
Сообщений: 208
20.01.2017, 08:24  [ТС] 3
Цитата Сообщение от Байт Посмотреть сообщение
Имхо, в классе QAbstractTableModel есть чисто виртуальные функции. И их надо перегрузить в производном классе.
Вот это то у меня и не получается, не пойму как перегружать виртуальные функции...
0
86 / 45 / 11
Регистрация: 20.12.2010
Сообщений: 216
Записей в блоге: 1
20.01.2017, 11:54 4
Лучший ответ Сообщение было отмечено Ирина197708 как решение

Решение

Ирина197708, В хедере правой кнопкой мыши по имени класса от которого наследуется твой. Выбираешь пункт рефакторинг, в нём есть пункт добавления вирт. функции
Миниатюры
QAbstractTableModel  
2
11 / 11 / 3
Регистрация: 06.08.2011
Сообщений: 208
20.01.2017, 12:29  [ТС] 5
Skjame спасибо, я даже и не знала)
0
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
20.01.2017, 12:33 6
Что перегружать - описано в классе QAbstractTableModel в секции Subclassing.
Как перегружать виртуальные функции - в книге по C++.
Что должно быть в перегруженных функциях - понятно из их названия. Каждый создаваемый тобой объект модели должен работать с какими-то данными. Поэтому в конструктор твоего класса передаешь эти данные по указателю или ссылке. Теперь твой класс точно знает, с какими данными работает. А значит в функции, например, количества строк, ты можешь вернуть количество элементов в этих данных. Если предполагается, что данные - это лист неких структур, то функция количества строк может вернуть количество элементов в листе структур. А функция количества столбцов - количество элементов в структуре. И т.д. в общем-то. Хитрая функция получения родительского элемента нужна только если у тебя есть грубо говоря иерархия итемов в таблице. Если у тебя обычная таблица аля матрица, то можешь взять эти (нарыл в интернете, ибо сам не врубался тогда):
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
QModelIndex MyCuteModel::index(int row, int column, const QModelIndex &parent) const
{
    if (!parent.isValid())
        return createIndex(row, column, static_cast<quintptr>(0));
    return createIndex(row, column, parent.row() + 1);
}
 
QModelIndex MyCuteModel::parent(const QModelIndex &child) const
{
    if (!child.isValid() || child.internalId() == 0)
        return QModelIndex();
    return createIndex(child.internalId() - 1, 0, static_cast<quintptr>(0));
}
Qt::ItemFlags MyCuteModel::flags(const QModelIndex &index) const
{
    Qt::ItemFlags flags = QAbstractItemModel::flags(index);
    if (index.isValid())
        flags |= Qt::ItemIsEditable;
 
    return flags;
}
Остальные функции по примеру тех, что я описал словами.
1
Pied Piper
236 / 227 / 57
Регистрация: 15.01.2013
Сообщений: 855
20.01.2017, 13:54 7
Цитата Сообщение от Ирина197708 Посмотреть сообщение
Вот это то у меня и не получается, не пойму как перегружать виртуальные функции...
Тогда вы практически не знаете C++.
0
11 / 11 / 3
Регистрация: 06.08.2011
Сообщений: 208
20.01.2017, 20:07  [ТС] 8
Горбаг и Skjame спасибо, что пнули в нужном направлении)
Переписала так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef MYTABLEMODEL_H
#define MYTABLEMODEL_H
#include <QAbstractTableModel>
 
#include "../connect/connect.h"
 
class MyTableModel : QAbstractTableModel
{
public:
    MyTableModel();
 
    // QAbstractItemModel interface
    QModelIndex index(int row, int column, const QModelIndex &parent) const;
    int rowCount(const QModelIndex &parent) const;
    int columnCount(const QModelIndex &parent) const;
    QVariant data(const QModelIndex &index, int role) const;
};
 
#endif // MYTABLEMODEL_H
mytablemodel.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "mytablemodel.h"
#include <QVariant>
 
 
MyTableModel::MyTableModel()
{
 
}
 int MyTableModel::rowCount(const QModelIndex &parent) const
 {
     return 5;
 }
 
 int MyTableModel::columnCount(const QModelIndex &parent) const
 {
     return 4;
 }
 
 QVariant MyTableModel::data(const QModelIndex &index, int role) const
 {
     if (role == Qt::DisplayRole) {
         QString unswer = QString("row = ") + QString::number(index.row()) + "  col = " + QString::number(index.column());
         // строкой выше мы формируем ответ. QString::number преобразует число в текст
         return QVariant(unswer);
         }
         return QVariant();
 }
mainwindow.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include "mytablemodel.h"
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private:
    Ui::MainWindow *ui;
};
 
#endif // MAINWINDOW_H
mainwindow.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QItemDelegate>
#include <QTableWidgetItem>
#include <QCheckBox>
 
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    MyTableModel *model = new MyTableModel();
 
   ui->tableView->setModel(model);
 
 
 
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
теперь получаю ошибку:
mainwindow.cpp:16: ошибка: 'QAbstractItemModel' is an inaccessible base of 'MyTableModel'
ui->tableView->setModel(model);

Не пойму почему 'QAbstractItemModel' я ведь использую QAbstractTableModel
0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
21.01.2017, 07:02 9
Цитата Сообщение от Ирина197708 Посмотреть сообщение
class MyTableModel : QAbstractTableModel
Правильно будет
C++ (Qt)
1
class MyTableModel : public QAbstractTableModel
1
11 / 11 / 3
Регистрация: 06.08.2011
Сообщений: 208
23.01.2017, 14:57  [ТС] 10
Что то получилось, только какая то уродливая таблица (((
Как убрать чекбоксы из нее, видимо можно как-то их скрыть?
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
MyTableModel::MyTableModel() : QAbstractTableModel()
{
    db = new dataBase();
    db->openDataBase();
 
}
 
//кол-во строк
 int MyTableModel::rowCount(const QModelIndex &parent) const
 {
     QSqlQuery query;
     query.exec("SELECT * FROM sity");
     QSqlRecord rec = query.record();
  int Number = 0;
  while(query.next()){
      Number = query.value(rec.indexOf("id")).toInt();
  }
  int ot = QVariant(Number).toInt();
  return ot;
 
 }
 
 int MyTableModel::columnCount(const QModelIndex &parent) const
 {
     return 3;  //столбцы
 }
 
 //Вывести данные в таблицу
 QVariant MyTableModel::data(const QModelIndex &index, int role) const
 {
     QSqlTableModel model;
     model.setTable("sity");
     model.select();
 
      if (role == Qt::DisplayRole) {
           QString text = model.data(index, Qt::DisplayRole).toString();
           return QVariant(text);
 
      }
 
 }
mainwindow.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    MyTableModel *model = new MyTableModel();
 
    ui->tableView->setModel(model);
    ui->tableView->setColumnHidden(0, true); // Скрываем колонку с id записей
    // Разрешаем выделение строк
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    // Устанавливаем режим выделения лишь одно строки в таблице
    ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
    //Выделение строки
    connect(ui->tableView->selectionModel(),
               SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
               SLOT(tableSelectionChanged()));
    tableSelectionChanged();
 
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::tableSelectionChanged(){
  QModelIndexList indexes = ui->tableView->selectionModel()->selection().indexes();
 
  for (int i = 0; i < indexes.count(); ++i)
  {
      QModelIndex index = indexes.at(i);
      qDebug() << index.row();
   }
 
}
QAbstractTableModel

Заранее спасибо.
0
23.01.2017, 14:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.01.2017, 14:57
Помогаю со студенческими работами здесь

Заполнение QAbstractTableModel
В общем, проблема вот в чем. Есть своя модель, в которую вставляю строки с данными так: void...

Поиск в QTableView (QAbstractTableModel)
В общем, есть QTableView , в которой установлена модель QAbstractTableModel (из себя представляет...

QAbstractTableModel и большой объем данных
Создал свою модель наследованную от QAbstractTableModel и отображаю ее в QTableView. Есть список...

Удаление последнего столбца QAbstractTableModel
Есть класс наследник QAbstractTableModel. Данные хранятся в QList&lt;QStringList&gt; records. Пытался...

Как связать QAbstractTableModel с таблицей БД?
Приветствую! В интернетах пишут что лучший способ для MVC это использование моделей...

Создание табличной модели от QAbstractTableModel. Сортировка
Добрый день. Я пытаюсь создать свою табличную модель, унаследованную от QAbstractTableModel. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru