как сделать производный класс qtreeview без ошибок: неопределенная ссылка на `vtable for RoomTree ' - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь предотвратить возможность перетаскивания некоторых объектов в дереве под другими объектами. Для этого я хочу изменить принцип работы ОДНОЙ функции. Поэтому я попытался использовать QTreeView в качестве базового класса для нового класса.

QT_Creator однако выдает ошибку: undefined ссылка на `vtable for RoomTree '

В попытке избавиться от ошибки Я добавил все виртуальные функции в QTreeView, которые смог найти, но они все равно не работают.

Итак, два вопроса 1: Что мне нужно добавить, чтобы это работало. 2: И действительно ли это единственный способ создать производный класс из QTreeView или есть способ сообщить C ++, что, если функция не находится в классе, просто используйте виртуальную функцию базового класса.

Я делаю знаю, что мне не нужно говорить виртуальный в производном классе, но он дает понять, что я добавил, чтобы сопоставить виртуальные объекты в QTreeView

Спасибо за любую помощь, которую вы можете оказать.

#ifndef ROOMTREE_H
#define ROOMTREE_H
#include <QTreeView>
class RoomTree : public QTreeView
{
    public:
    RoomTree(QWidget *parent = nullptr);
//    ~RoomTree();
    virtual ~RoomTree();

    virtual void    dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>()) override{return QTreeView::dataChanged(topLeft, bottomRight, roles);}
    virtual QModelIndex indexAt(const QPoint &point) const override{return QTreeView::indexAt(point);}
    virtual void    keyboardSearch(const QString &search) override{return QTreeView::keyboardSearch(search);}
    virtual void    reset() override{return QTreeView::reset();}
    virtual void    scrollTo(const QModelIndex &index, QAbstractItemView::ScrollHint hint = EnsureVisible) override{return QTreeView::scrollTo(index, hint);}
    virtual void    selectAll() override{return QTreeView::selectAll();}
    virtual void    setModel(QAbstractItemModel *model) override{return QTreeView::setModel(model);}
    virtual void    setRootIndex(const QModelIndex &index) override{return QTreeView::setRootIndex(index);}
    virtual void    setSelectionModel(QItemSelectionModel *selectionModel) override{return QTreeView::setSelectionModel(selectionModel);}
    virtual QRect   visualRect(const QModelIndex &index) const override{return QTreeView::visualRect(index);}
protected:
    virtual void    drawBranches(QPainter *painter, const QRect &rect, const QModelIndex &index) const{return QTreeView::drawBranches(painter, rect, index);}
    virtual void    drawRow(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const{return QTreeView::drawRow(painter, option, index);}

    virtual void    currentChanged(const QModelIndex &current, const QModelIndex &previous) override{return QTreeView::currentChanged(current, previous);}
    virtual void    dragMoveEvent(QDragMoveEvent *event) override{return QTreeView::dragMoveEvent(event);}
    virtual int horizontalOffset() const override{return QTreeView::horizontalOffset();}
    virtual bool    isIndexHidden(const QModelIndex &index) const override{return QTreeView::isIndexHidden(index);}
    virtual void    keyPressEvent(QKeyEvent *event) override{return QTreeView::keyPressEvent(event);}
    virtual void    mouseDoubleClickEvent(QMouseEvent *event) override{return QTreeView::mouseDoubleClickEvent(event);}
    virtual void    mouseMoveEvent(QMouseEvent *event) override{return QTreeView::mouseMoveEvent(event);}
    virtual void    mousePressEvent(QMouseEvent *event) override{return QTreeView::mousePressEvent(event);}
    virtual void    mouseReleaseEvent(QMouseEvent *event) override{return QTreeView::mouseReleaseEvent(event);}
    virtual QModelIndex moveCursor(QAbstractItemView::CursorAction cursorAction, Qt::KeyboardModifiers modifiers) override{return QTreeView::moveCursor(cursorAction, modifiers);}
    virtual void    paintEvent(QPaintEvent *event) override{return QTreeView::paintEvent(event);}
    virtual void    rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) override{return QTreeView::rowsAboutToBeRemoved(parent, start, end);}
    virtual void    rowsInserted(const QModelIndex &parent, int start, int end) override{return QTreeView::rowsInserted(parent, start, end);}
    virtual void    scrollContentsBy(int dx, int dy) override{return QTreeView::scrollContentsBy(dx, dy);}
    virtual QModelIndexList selectedIndexes() const override{return QTreeView::selectedIndexes();}
    virtual void    selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) override{return QTreeView::selectionChanged(selected, deselected);}
    virtual void    setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command) override{return QTreeView::setSelection(rect, command);}
    virtual int sizeHintForColumn(int column) const override{return QTreeView::sizeHintForColumn(column);}
    virtual void    timerEvent(QTimerEvent *event) override{return QTreeView::timerEvent(event);}
    virtual void    updateGeometries() override{return QTreeView::updateGeometries();}
    virtual int verticalOffset() const override{return QTreeView::verticalOffset();}
    virtual bool    viewportEvent(QEvent *event) override{return QTreeView::viewportEvent(event);}
    virtual QSize   viewportSizeHint() const override{return QTreeView::viewportSizeHint();}
    virtual QRegion visualRegionForSelection(const QItemSelection &selection) const override{return QTreeView::visualRegionForSelection(selection);}
};

#endif // ROOMTREE_H

1 Ответ

0 голосов
/ 30 мая 2020

bnaecker Правильно, все, что мне нужно было сделать, это добавить Q_OBJECT в класс. Мне также по какой-то причине пришлось сделать полную перестройку.

Это работает:

class RoomTree : public QTreeView
{
Q_OBJECT
    public:
    RoomTree(QWidget *parent = nullptr);
//    ~RoomTree();
    ~RoomTree(){};


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