Russian Qt Forum
Март 28, 2024, 21:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QObject is an inaccessible base of 'Мой класс'  (Прочитано 7629 раз)
maks1596
Гость
« : Май 26, 2018, 22:25 »

Сотворил я свою модель данных, публично отнаследовавшись от QAbstractTableModel. Вызываю в модели connect и получаю ошибку QObject is an inaccessible base of 'Мой класс'.
  • Макрос Q_OBJECT заюзал.
  • qmake перезапустил.
  • В конструкторе аккуратно вызвал QAbstractTableModel(parent).
  • Проверил, что QAbstractTableModel, хоть и не напрямую, но наследуется от QObject.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Май 27, 2018, 10:11 »

Код показывай.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Май 27, 2018, 15:33 »

Не видит полного описания QObject. Легко проверить напр
Код
C++ (Qt)
QObject obj;  // должно выдать ошибку
Записан
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #3 : Май 27, 2018, 16:40 »

у QAbstractTableModel много чисто виртуальных методов, их все надо у себя реализовать.
Проще от QStandartTableModel наследоваться.
Записан
maks1596
Гость
« Ответ #4 : Май 27, 2018, 17:57 »

у QAbstractTableModel много чисто виртуальных методов, их все надо у себя реализовать.
Проще от QStandartTableModel наследоваться.
Гарантированно не в этом проблема, потому что компилятор писал бы, что я не могу создать объект из-за чисто виртуальных методов.
Ну и QStandartTableModel не существует. Есть QStandartItemModel, но это не важно потому, что, как говорится, "см. 1-ый пункт".
« Последнее редактирование: Май 27, 2018, 18:17 от maks1596 » Записан
maks1596
Гость
« Ответ #5 : Май 27, 2018, 18:05 »

Не видит полного описания QObject. Легко проверить напр
Код
C++ (Qt)
QObject obj;  // должно выдать ошибку
Нет, не ругается.
Кстати, странная теория, потому что, чтобы отнаследоваться от класса, необходимо заинклюдить файл этого класса. Так что где-то там по-любому есть определение QObject.
Записан
maks1596
Гость
« Ответ #6 : Май 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
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Май 27, 2018, 19:42 »

Ругается на второй коннект? Нафига ты туда inline вставил?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
maks1596
Гость
« Ответ #8 : Май 27, 2018, 20:11 »

Ругается на второй коннект?
На оба. На тот, что в конструкторе, даже дважды Смеющийся
Нафига ты туда inline вставил?
Чтобы inline-илось. Очевидно же Улыбающийся
inline убрал - не помогло.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Май 27, 2018, 20:15 »

maks, покажи полный вывод компилятора. Ошибку пока не вижу. Грустный
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
maks1596
Гость
« Ответ #10 : Май 27, 2018, 20:20 »

maks, покажи полный вывод компилятора. Ошибку пока не вижу. Грустный

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

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #11 : Май 27, 2018, 20:25 »

А у меня тоже в глазах путались эти модель и сервис. )))
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.227 секунд. Запросов: 23.