Russian Qt Forum

Qt => Общие вопросы => Тема начата: maks1596 от Май 26, 2018, 22:25



Название: QObject is an inaccessible base of 'Мой класс'
Отправлено: maks1596 от Май 26, 2018, 22:25
Сотворил я свою модель данных, публично отнаследовавшись от QAbstractTableModel. Вызываю в модели connect и получаю ошибку QObject is an inaccessible base of 'Мой класс'.
  • Макрос Q_OBJECT заюзал.
  • qmake перезапустил.
  • В конструкторе аккуратно вызвал QAbstractTableModel(parent).
  • Проверил, что QAbstractTableModel, хоть и не напрямую, но наследуется от QObject.


Название: Re: QObject is an inaccessible base of 'Мой класс'
Отправлено: Пантер от Май 27, 2018, 10:11
Код показывай.


Название: Re: QObject is an inaccessible base of 'Мой класс'
Отправлено: Igors от Май 27, 2018, 15:33
Не видит полного описания QObject. Легко проверить напр
Код
C++ (Qt)
QObject obj;  // должно выдать ошибку


Название: Re: QObject is an inaccessible base of 'Мой класс'
Отправлено: RedDog от Май 27, 2018, 16:40
у QAbstractTableModel много чисто виртуальных методов, их все надо у себя реализовать.
Проще от QStandartTableModel наследоваться.


Название: Re: QObject is an inaccessible base of 'Мой класс'
Отправлено: maks1596 от Май 27, 2018, 17:57
у QAbstractTableModel много чисто виртуальных методов, их все надо у себя реализовать.
Проще от QStandartTableModel наследоваться.
Гарантированно не в этом проблема, потому что компилятор писал бы, что я не могу создать объект из-за чисто виртуальных методов.
Ну и QStandartTableModel не существует. Есть QStandartItemModel, но это не важно потому, что, как говорится, "см. 1-ый пункт".


Название: Re: QObject is an inaccessible base of 'Мой класс'
Отправлено: maks1596 от Май 27, 2018, 18:05
Не видит полного описания QObject. Легко проверить напр
Код
C++ (Qt)
QObject obj;  // должно выдать ошибку
Нет, не ругается.
Кстати, странная теория, потому что, чтобы отнаследоваться от класса, необходимо заинклюдить файл этого класса. Так что где-то там по-любому есть определение QObject.


Название: Re: QObject is an inaccessible base of 'Мой класс'
Отправлено: maks1596 от Май 27, 2018, 18:13
Код показывай.

Заголовочный
Код
C++ (Qt)
#pragma once
 
#include <QAbstractTableModel>
 
#include "Entities/PassedTestPreview/PassedTestPreview.h"
 
class QTimer;
class PassedTestPreview;
class PassedTestsService;
 
class PassedTestsModel : public QAbstractTableModel {
   Q_OBJECT
 
public:
   //  :: Lifecycle ::
   PassedTestsModel(QObject *parent = nullptr);
 
   //  :: QAbstractTableModel ::
 
   int rowCount(const QModelIndex &parent) const override;
   int columnCount(const QModelIndex &parent) const override;
   QVariant data(const QModelIndex &index, int role) const override;
 
   QVariant headerData(int section, Qt::Orientation orientation, int role) const;
 
   //  :: Accessors ::
   QList<PassedTestPreview> getPassedTestPreviews() const;
   void setPassedTestPreviews(const QList<PassedTestPreview> &previews);
 
public slots:
   void startUpdating() const;
   void stopUpdating() const;
 
private:
   void initService();
   void initTimer();
   void emitDataChanged();
 
   QList<PassedTestPreview> m_previews;
   QTimer *m_timer;
   PassedTestsService *m_service;
};
 

Реализация
Код
C++ (Qt)
#include "PassedTestsModel.h"
 
#include <QTimer>
 
#include "Entities/PassedTestPreview/PassedTestPreview.h"
 
#include "../Service/PassedTestsService.h"
 
//  :: Constants ::
 
enum ColumnIndex {
   NAME_COLUMN_INDEX,
   NUMBER_OF_PASSES_COLUMN_INDEX,
   NUMBER_OF_COLUMNS
};
 
const QStringList kHorizontalHeaders {
   "Название теста",
   "Пройден"
};
 
const int UPDATE_INTERVAL = 5000;
 
//  :: Lifecycle ::
 
PassedTestsModel::PassedTestsModel(QObject *parent/*= nullptr*/)
   : QAbstractTableModel(parent)
{
   initService();
   initTimer();
   connect(m_timer, &QTimer::timeout,
           m_service, &PassedTestsService::getPreviews);
   startUpdating();
}
 
//  :: QAbstractTableModel ::
 
int PassedTestsModel::rowCount(const QModelIndex &) const {
   return m_previews.size();
}
 
int PassedTestsModel::columnCount(const QModelIndex &) const {
   return NUMBER_OF_COLUMNS;
}
 
QVariant PassedTestsModel::data(const QModelIndex &index, int role) const {
   if (index.isValid() && role == Qt::DisplayRole) {
       auto preview = m_previews[index.row()];
       switch (index.column()) {
       case NAME_COLUMN_INDEX:
           return preview.getName();
       case NUMBER_OF_PASSES_COLUMN_INDEX:
           return preview.getNumberOfPasses();
       }
   }
   return QVariant();
}
 
QVariant PassedTestsModel::headerData(int section,
                                     Qt::Orientation orientation,
                                     int role) const {
   if (role == Qt::DisplayRole) {
       if (orientation == Qt::Horizontal) {
           return kHorizontalHeaders[section];
       } else {
           return section + 1;
       }
   }
   return QVariant();
}
 
//  :: Public accessors ::
//  :: Passed test previews ::
QList<PassedTestPreview> PassedTestsModel::getPassedTestPreviews() const {
   return m_previews;
}
void PassedTestsModel::setPassedTestPreviews(const QList<PassedTestPreview> &previews) {
   m_previews = previews;
   emitDataChanged();
}
 
//  :: Public slots ::
 
void PassedTestsModel::startUpdating() const {
   m_service->getPreviews();
   m_timer->start();
}
 
void PassedTestsModel::stopUpdating() const {
   m_timer->stop();
}
 
//  :: Private methods ::
 
inline
void PassedTestsModel::initService() {
   m_service = new PassedTestsService(this);
   connect(m_service, &PassedTestsService::previewsGot,
           this, &PassedTestsModel::setPassedTestPreviews);
}
 
inline
void PassedTestsModel::initTimer() {
   m_timer = new QTimer(this);
   m_timer->setInterval(UPDATE_INTERVAL);
}
 
inline
void PassedTestsModel::emitDataChanged() {
   auto topLeft = index(0, 0);
   auto bottomRight = index(m_previews.size() - 1,
                            NUMBER_OF_COLUMNS - 1);
   emit dataChanged(topLeft, bottomRight);
}
 
 

Ещё раз акцентирую, что ошибка появилась после попытки вызвать метод connect


Название: Re: QObject is an inaccessible base of 'Мой класс'
Отправлено: Пантер от Май 27, 2018, 19:42
Ругается на второй коннект? Нафига ты туда inline вставил?


Название: Re: QObject is an inaccessible base of 'Мой класс'
Отправлено: maks1596 от Май 27, 2018, 20:11
Ругается на второй коннект?
На оба. На тот, что в конструкторе, даже дважды ;D
Нафига ты туда inline вставил?
Чтобы inline-илось. Очевидно же :)
inline убрал - не помогло.


Название: Re: QObject is an inaccessible base of 'Мой класс'
Отправлено: Пантер от Май 27, 2018, 20:15
maks, покажи полный вывод компилятора. Ошибку пока не вижу. :(


Название: Re: QObject is an inaccessible base of 'Мой класс'
Отправлено: maks1596 от Май 27, 2018, 20:20
maks, покажи полный вывод компилятора. Ошибку пока не вижу. :(

Ох, я невнимательный! Компилятор показывал ошибку про Service, но видать вечером по запарке для меня Model и Service стало одним и тем же. В общем, я непублично отнаследовал Serivce.
Всем спасибо. Тему можно закрывать.


Название: Re: QObject is an inaccessible base of 'Мой класс'
Отправлено: Пантер от Май 27, 2018, 20:25
А у меня тоже в глазах путались эти модель и сервис. )))