неопределенная ссылка на "_imp____ имя класса ____ виртуальный метод" в Qt 5.14.1 с QAbstractTableModel - PullRequest
1 голос
/ 04 марта 2020

все. Извините за мой Engli sh. Я немного знаю Энгли sh. У меня необычная проблема. Я создал AbstractModel, унаследованный от QAbstractTableModel, и MyAdvModel, унаследованный от AbstractModel. Это мой код частично.

// abstactmodel.hpp

#pragma once

#include <QAbstractTableModel>
#include "db/utility.hpp"
#include "net/serverloader.hpp"

class QNetworkReply;
class AbstractModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    virtual void parseData(QByteArray*) = 0;
    enum Error{NoError = 0, Null, NoFound, BadJson, NoServerConnection, Unknown};
    explicit AbstractModel(QObject *parent = nullptr);
    void setUrl(const QString&);
    void clearParams();
    void addParam(const QString&, const QVariant&);
    void delParam(const QString&);
    void post();
    void get();
protected:
    ServerLoader* server() const;
private slots:
    void response(QNetworkReply*);
private:
    unique_ptr<ServerLoader> _loader;
    unique_ptr<QVariantMap> _params;
};

// myadvmodel.hpp

#pragma once

#include "models/abstractmodel.hpp"
#include <QAbstractTableModel>
#include <tuple>
#include <vector>
#include <map>

class MyAdvModel :public AbstractModel
{
    Q_OBJECT

public:

    static constexpr auto ID_FIELD          = 0;
    static constexpr auto TYPE_FIELD        = 1;
     static constexpr auto ISCLOSED_FIELD    = 2;
//    static constexpr auto ISARRIVED_FIELD   = 3;
    static constexpr auto DATA_FIELD        = 3;
    static constexpr auto STATUS            = 0;
    static constexpr auto LAST              = 6;
    static constexpr auto COLUMNS           = 7;
    enum Type {Driver, Passanger};
    qint32 ID, MAX_ID;
    //                                    id       p/d     isc   isa   datas
    using data_t = std::vector<std::tuple<int32_t, Type, bool,/* bool,*/ std::map<QString, QVariant>>>;
    explicit MyAdvModel(QObject *parent = nullptr);
    ~MyAdvModel() override;
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    int columnCount(const QModelIndex &parent = QModelIndex()) const override;
    bool setData(const QModelIndex &index, const QVariant &value,
                 int role = Qt::EditRole) override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    Qt::ItemFlags flags(const QModelIndex& index) const override;
private:
    std::unique_ptr<data_t> _data, _tmp;
private slots:
    void parsed();
public:
    void parseData(QByteArray *) override;
};

во время компиляции. Я получаю сообщение об ошибке.

myadvmodel.o: myadvmodel. cpp :(. Text + 0x1225): неопределенная ссылка на> `_imp___ZNK18QAbstractItemModel4dataERK11QModelIndexi 'collect2.exe: ошибка: ld вернул выход 1 mingw32-make: *** [Makefile: 182: up_desktop.exe] Ошибка 1 20:38:38: Процесс «C: \ Qt \ Tools \ mingw730_32 \ bin \ mingw32-make.exe» завершился с кодом 2. Ошибка при сборке / развёртывании проекта up_desktop (комплект: рабочий стол MinGW_32) Во время выполнения этапа «Сборка»

Спасибо всем, кто мне помогает. еще раз извините за мой английский sh.

Ответы [ 2 ]

1 голос
/ 04 марта 2020

QAbstractItemModel - абстрактный базовый класс. При создании подкласса все чисто виртуальные функции должны быть реализованы как минимум в одном из подклассов. В этом случае компоновщик жалуется на отсутствующую функцию data () , которая является чисто виртуальной (= 0).

Так что реализуйте эту и все другие чисто виртуальные функции (например, columnCount(), index(), parent(), et c.)

0 голосов
/ 04 марта 2020

Спасибо за все. Я решил эту проблему.

в моей myadvmodel. cpp файл

в реализации

QVariant MyAdvModel::data(const QModelIndex &index, int role) const
{
//......
   return AbstractModel::data(index, role);
//......
}

это моя ошибка. в моем классе AbstractModel я не написал реализацию метода данных. в этой ситуации мой компилятор дал мне ошибку для этого кода AbstractModel::data(index, role);. :) спасибо за все, и извините за мой английский sh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...