Название: 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
А у меня тоже в глазах путались эти модель и сервис. )))
|