Reputation: 417
I've gone through the Qt 4.7 C++ tutorials and I've started a project to extend some of the functionality of QTreeView.
I'm attempting to do the following:
I am getting the following warnings (using MSVC, command-line):
.\CustomTreeView.cpp(147) : warning C4273: 'CustomTreeView::CustomTreeView' : inconsistent dll linkage
c:\home\jetimms\code\projects\CustomTreeViewTest\CustomTreeView.hpp(31) : see previous definition of '{ctor}'
There are many more of these warnings, but they look the same as above.
Also, I have these errors:
.\CustomTreeView.cpp(1216) : error C2248: 'NoState' : cannot access protected enumerator declared in class 'QAbstractItemView'
c:\qt\4.7.0\include\qtgui\../../src/gui/itemviews/qabstractitemview.h(304) : see declaration of 'NoState'
c:\qt\4.7.0\include\qtgui\../../src/gui/itemviews/qabstractitemview.h(63) : see declaration of 'QAbstractItemView'
.\CustomTreeView.cpp(1216) : error C2248: 'EditingState' : cannot access protected enumerator declared in class 'QAbstractItemView'
c:\qt\4.7.0\include\qtgui\../../src/gui/itemviews/qabstractitemview.h(307) : see declaration of 'EditingState'
c:\qt\4.7.0\include\qtgui\../../src/gui/itemviews/qabstractitemview.h(63) : see declaration of 'QAbstractItemView'
The above is complaining about the equivalent of the following (in qtreeview.h) with no changes except replacing QTreeView with CustomTreeView:
bool QTreeViewPrivate::expandOrCollapseItemAtPos(const QPoint &pos)
{
Q_Q(QTreeView);
// we want to handle mousePress in EditingState (persistent editors)
if ((state != QAbstractItemView::NoState
&& state != QAbstractItemView::EditingState)
|| !viewport->rect().contains(pos))
return true;
int i = itemDecorationAt(pos);
if ((i != -1) && itemsExpandable && hasVisibleChildren(viewItems.at(i).index)) {
if (viewItems.at(i).expanded)
collapse(i, true);
else
expand(i, true);
if (!isAnimating()) {
q->updateGeometries();
viewport->update();
}
return true;
}
return false;
}
I have included these new files in the .pro file in the SOURCES and HEADERS. I do not have extra versions of the constructor included as the above warning says.
updated: 20110710_0926
Here is the actual code that causes the errors:
bool CustomTreeViewPrivate::expandOrCollapseItemAtPos(const QPoint &pos) {
Q_Q(CustomTreeView);
// we want to handle mousePress in EditingState (persistent editors)
if ((state != QAbstractItemView::NoState
&& state != QAbstractItemView::EditingState)
|| !viewport->rect().contains(pos))
return true;
int i = itemDecorationAt(pos);
if ((i != -1) && itemsExpandable && hasVisibleChildren(viewItems.at(i).index)) {
if (viewItems.at(i).expanded)
collapse(i, true);
else
expand(i, true);
if (!isAnimating()) {
q->updateGeometries();
viewport->update();
}
return true;
}
return false;
}
updated 20110710_1339:
When I attempted to compile (using qmake, as before) replacing my custom class with the qtreeview files in ..\src\gui\itemviews\, I received very similar warnings.
c:\Qt\4.7.0\src\gui\itemviews\qtreeview.cpp(187) : warning C4273: 'QTreeView::QTreeView' : inconsistent dll linkage
c:\qt\4.7.0\src\gui\itemviews\qtreeview.h(74) : see previous definition
of '{ctor}'
There is only one error that appears with this try and it has to do with (moc_qtreeview.cpp which is compiled on the fly?):
C:\home\jetimms\code\projects\cashflow\debug\moc_qtreeview.cpp(95) : error C2491: 'QTreeView::staticMetaObject' : definition of dllimport static data member not allowed
Not sure if it tells me anything related to the cause of the warnings. Here is that snippit of code:
const QMetaObject QTreeView::staticMetaObject = {
{ &QAbstractItemView::staticMetaObject, qt_meta_stringdata_QTreeView,
qt_meta_data_QTreeView, 0 }
};
I just find it strange that the QTreeView files themselves error out when I try to build with them.
Anyhow, the warning is telling me that the constructor for QTreeView has already been defined. I have guards on all of my header files, so there's nowhere that I can think of that it would think the QTreeView was defined twice.
updated: 20110710_1612
Here is the beginning of QTreeView.h with the definition of QTreeView. Note that it includes the QAbstractItemView.h and inherits from it.
#include <QtGui/qabstractitemview.h>
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
QT_MODULE(Gui)
#ifndef QT_NO_TREEVIEW
class QTreeViewPrivate;
class QHeaderView;
class Q_GUI_EXPORT QTreeView : public QAbstractItemView
{
...
In exactly the same way, my custom class inherits from it.
#include <QtGui/qabstractitemview.h>
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
QT_MODULE(Gui)
#ifndef QT_NO_TREEVIEW
class CustomTreeViewPrivate;
class QHeaderView;
class Q_GUI_EXPORT CustomTreeView : public QAbstractItemView
{
updated: 20110710_1757
It dawned on me that the code I was copying from QTreeView is for a library and I am not building a library, just the .exe for my app. I removed the Q_GUI_EXPORT from the constructor (just above) and the warnings I was experiencing were gone.
Now I am getting an error dealing with the moc_CustomTreeView.cpp file (there are 3 errors in all, all like this one):
debug\moc_CustomTreeView.cpp(140) : error C2027: use of undefined type 'CustomTreeViewPrivate'
c:\home\jetimms\code\projects\cashflow\debug\../CustomTreeView.hpp(12) : see declaration of 'CustomTreeViewPrivate'
debug\moc_CustomTreeView.cpp(140) : error C2227: left of '->_q_endAnimatedOperation' must point to class/struct/union/generic type
Here's the offending code:
case 16: d_func()->_q_endAnimatedOperation(); break;
Not sure what to do about the moc_ file errors. d_func() grabs the CustomTreeViewPrivate instance, but the moc_ file scope can't see it.
updated: 20110710_1757
I looked around to understand moc_ files and the Qt way of development and found these two. KDE Techbase Policies/Library Code Policy This one explains why the Qt code is written as it is, using private classes and such.
I also found the following page that explains what to do when your moc_ code gives you errors like the ones I have above (rerun qmake), Using the Meta-Object Compiler (moc). I tried this and the above moc_ errors went away and now I am presented with these.
Bye the way, I changed the CustomTreeView name to SummaryDrillDownTreeView2.
SummaryDrillDownTreeView2.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall QAbstractItemViewPrivate::~QAbstractItemViewPrivate(void)" (??1QAbstractItemViewPrivate@@UAE@XZ) referenced in function __unwindfunclet$??0SummaryDrillDownTreeView2Private@@QAE@XZ$0
SummaryDrillDownTreeView2.obj : error LNK2019: unresolved external symbol "public: __thiscall QAbstractItemViewPrivate::QAbstractItemViewPrivate(void)" (??0QAbstractItemViewPrivate@@QAE@XZ) referenced in function "public: __thiscall SummaryDrillDownTreeView2Private::SummaryDrillDownTreeView2Private(void)" (??0SummaryDrillDownTreeView2Private@@QAE@XZ)
SummaryDrillDownTreeView2.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall QAbstractItemViewPrivate::_q_rowsRemoved(class QModelIndex const &,int,int)" (?_q_rowsRemoved@QAbstractItemViewPrivate@@UAEXABVQModelIndex@@HH@Z)
SummaryDrillDownTreeView2.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall QAbstractItemViewPrivate::_q_columnsInserted(class QModelIndex const &,int,int)" (?_q_columnsInserted@QAbstractItemViewPrivate@@UAEXABVQModelIndex@@HH@Z)
SummaryDrillDownTreeView2.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall QAbstractItemViewPrivate::_q_layoutChanged(void)" (?_q_layoutChanged@QAbstractItemViewPrivate@@UAEXXZ)
SummaryDrillDownTreeView2.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall QAbstractItemViewPrivate::selectAll(class QFlags<enum QItemSelectionModel::SelectionFlag>)" (?selectAll@QAbstractItemViewPrivate@@UAEXV?$QFlags@W4SelectionFlag@QItemSelectionModel@@@@@Z)
SummaryDrillDownTreeView2.obj : error LNK2001: unresolved external symbol "public: virtual enum QAbstractItemView::DropIndicatorPosition __thiscall QAbstractItemViewPrivate::position(class QPoint const &,class QRect const &,class QModelIndex const &)const " (?position@QAbstractItemViewPrivate@@UBE?AW4DropIndicatorPosition@QAbstractItemView@@ABVQPoint@@ABVQRect@@ABVQModelIndex@@@Z)
SummaryDrillDownTreeView2.obj : error LNK2019: unresolved external symbol "public: void __thiscall QAbstractItemViewPrivate::doDelayedItemsLayout(int)" (?doDelayedItemsLayout@QAbstractItemViewPrivate@@QAEXH@Z) referenced in function "public: void __thiscall SummaryDrillDownTreeView2::setRowHidden(int,class QModelIndex const &,bool)" (?setRowHidden@SummaryDrillDownTreeView2@@QAEXHABVQModelIndex@@_N@Z)
SummaryDrillDownTreeView2.obj : error LNK2019: unresolved external symbol "public: void __thiscall QAbstractItemViewPrivate::interruptDelayedItemsLayout(void)const " (?interruptDelayedItemsLayout@QAbstractItemViewPrivate@@QBEXXZ) referenced in function "public: void __thiscall SummaryDrillDownTreeView2::expandAll(void)" (?expandAll@SummaryDrillDownTreeView2@@QAEXXZ)
SummaryDrillDownTreeView2.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall QAbstractItemViewPrivate::_q_modelDestroyed(void)" (?_q_modelDestroyed@QAbstractItemViewPrivate@@UAEXXZ) referenced in function "public: virtual void __thiscall SummaryDrillDownTreeView2Private::_q_modelDestroyed(void)" (?_q_modelDestroyed@SummaryDrillDownTreeView2Private@@UAEXXZ)
SummaryDrillDownTreeView2.obj : error LNK2019: unresolved external symbol "public: virtual class QList<struct QPair<class QRect,class QModelIndex> > __thiscall QAbstractItemViewPrivate::draggablePaintPairs(class QList<class QModelIndex> const &,class QRect *)const " (?draggablePaintPairs@QAbstractItemViewPrivate@@UBE?AV?$QList@U?$QPair@VQRect@@VQModelIndex@@@@@@ABV?$QList@VQModelIndex@@@@PAVQRect@@@Z) referenced in function "public: virtual class QList<struct QPair<class QRect,class QModelIndex> > __thiscall SummaryDrillDownTreeView2Private::draggablePaintPairs(class QList<class QModelIndex> const &,class QRect *)const " (?draggablePaintPairs@SummaryDrillDownTreeView2Private@@UBE?AV?$QList@U?$QPair@VQRect@@VQModelIndex@@@@@@ABV?$QList@VQModelIndex@@@@PAVQRect@@@Z)
SummaryDrillDownTreeView2.obj : error LNK2019: unresolved external symbol "public: class QStyleOptionViewItemV4 __thiscall QAbstractItemViewPrivate::viewOptionsV4(void)const " (?viewOptionsV4@QAbstractItemViewPrivate@@QBE?AVQStyleOptionViewItemV4@@XZ) referenced in function "protected: void __thiscall SummaryDrillDownTreeView2::drawTree(class QPainter *,class QRegion const &)const " (?drawTree@SummaryDrillDownTreeView2@@IBEXPAVQPainter@@ABVQRegion@@@Z)
SummaryDrillDownTreeView2.obj : error LNK2019: unresolved external symbol "public: struct QEditorInfo __thiscall QAbstractItemViewPrivate::editorForIndex(class QModelIndex const &)const " (?editorForIndex@QAbstractItemViewPrivate@@QBE?AUQEditorInfo@@ABVQModelIndex@@@Z) referenced in function "protected: virtual void __thiscall SummaryDrillDownTreeView2::drawRow(class QPainter *,class QStyleOptionViewItem const &,class QModelIndex const &)const " (?drawRow@SummaryDrillDownTreeView2@@MBEXPAVQPainter@@ABVQStyleOptionViewItem@@ABVQModelIndex@@@Z)
SummaryDrillDownTreeView2.obj : error LNK2019: unresolved external symbol "public: void __thiscall QFramePrivate::updateStyledFrameWidths(void)" (?updateStyledFrameWidths@QFramePrivate@@QAEXXZ) referenced in function "public: void __thiscall SummaryDrillDownTreeView2Private::initialize(void)" (?initialize@SummaryDrillDownTreeView2Private@@QAEXXZ)
SummaryDrillDownTreeView2.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall QAbstractItemViewPrivate::_q_columnsAboutToBeRemoved(class QModelIndex const &,int,int)" (?_q_columnsAboutToBeRemoved@QAbstractItemViewPrivate@@UAEXABVQModelIndex@@HH@Z) referenced in function "public: virtual void __thiscall SummaryDrillDownTreeView2Private::_q_columnsAboutToBeRemoved(class QModelIndex const &,int,int)" (?_q_columnsAboutToBeRemoved@SummaryDrillDownTreeView2Private@@UAEXABVQModelIndex@@HH@Z)
SummaryDrillDownTreeView2.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall QAbstractItemViewPrivate::_q_columnsRemoved(class QModelIndex const &,int,int)" (?_q_columnsRemoved@QAbstractItemViewPrivate@@UAEXABVQModelIndex@@HH@Z) referenced in function "public: virtual void __thiscall SummaryDrillDownTreeView2Private::_q_columnsRemoved(class QModelIndex const &,int,int)" (?_q_columnsRemoved@SummaryDrillDownTreeView2Private@@UAEXABVQModelIndex@@HH@Z)
debug\cashflow.exe : fatal error LNK1120: 16 unresolved externals
Upvotes: 0
Views: 1511
Reputation: 8601
I can’t really say about MSVC, but those members are declared as protected for QAbstractTreeView, like the error says. You didn’t paste source related to errors, but I guess you are trying to use those protected members somehow that does not qualify as sub-class usage, maybe by doing an instance and using that?
EDIT:
if ((state != QAbstractItemView::NoState
This is the actual line that is causing the error. Here you are using a protected member of QAbstractView, which is not allowed, as protected members are purely allowed to use for subclasses.
If you class inherited the QAbstractView, you could use that member.
Upvotes: 1
Reputation: 395
You should use inheritance to create the new class, rather than copy and paste. Less code to maintain that way, and less likely to break with even minor Qt upgrades.
Upvotes: 6