0

I am trying to keep a drag and drop from being able to place some objects in the tree under other objects. To do this I want to change how ONE function works. So I tried to use QTreeView as a base class to a new class.

QT_Creator however throws an error: undefined reference to `vtable for RoomTree'

In an attempt to get rid of the error I have added every virtual function in the QTreeView I could find but it still will not work.

So two questions 1: What do i need to add to get this to work. 2: And Is this really the only way to create a derived class from the QTreeView or is there a way to tell C++ That if the function is not in the class just use the base class virtual function.

I do know that I don't need to say virtual in the derived class but it makes it clear what I added to match the virtuals in the QTreeView

Thanks for any help you can give.

#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
  • This is usually because you don't have the `Q_OBJECT` macro defined in your class. See [here](https://stackoverflow.com/questions/2555816/qt-linker-error-undefined-reference-to-vtable) or [here](https://stackoverflow.com/questions/1552069/undefined-reference-to-vtable-trying-to-compile-a-qt-project). – bnaecker May 30 '20 at 00:21

1 Answers1

1

bnaecker Was correct all I needed to do was add Q_OBJECT to the class. I also had to do a complete rebuild for some reason.

This works:

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


};