【发布时间】:2011-07-10 12:27:24
【问题描述】:
我已经阅读了 Qt 4.7 C++ 教程,并开始了一个项目来扩展 QTreeView 的一些功能。
我正在尝试执行以下操作:
- 使用 QTreeView 确保程序运行良好
- 基于 ..\src\gui\itemviews\qtreeview.cpp、qtreeview.h 和 qtreeview_p.h 复制和粘贴新文件
- 在每个文件名和每个文件(包括 .pro 文件)中将“QTreeView”替换为“CustomTreeView”
我收到以下警告(使用 MSVC,命令行):
.\CustomTreeView.cpp(147) : warning C4273: 'CustomTreeView::CustomTreeView' : inconsistent dll linkage
c:\home\jetimms\code\projects\CustomTreeViewTest\CustomTreeView.hpp(31) : see previous definition of '{ctor}'
这些警告还有很多,但它们看起来与上面相同。
另外,我有这些错误:
.\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'
上面是在抱怨以下内容的等价物(在 qtreeview.h 中),除了用 CustomTreeView 替换 QTreeView 之外没有任何变化:
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;
}
我已将这些新文件包含在 SOURCES 和 HEADERS 的 .pro 文件中。正如上面的警告所说,我没有包含额外版本的构造函数。
更新:20110710_0926
这是导致错误的实际代码:
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;
}
更新 20110710_1339:
当我尝试编译(像以前一样使用 qmake)用 ..\src\gui\itemviews\ 中的 qtreeview 文件替换我的自定义类时,我收到了非常相似的警告。
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
来自“{ctor}”
这次尝试只出现一个错误,它与 (moc_qtreeview.cpp 是即时编译的?)有关:
C:\home\jetimms\code\projects\cashflow\debug\moc_qtreeview.cpp(95) : error C2491: 'QTreeView::staticMetaObject' : definition of dllimport static data member not allowed
不确定它是否告诉我任何与警告原因相关的信息。这是代码片段:
const QMetaObject QTreeView::staticMetaObject = {
{ &QAbstractItemView::staticMetaObject, qt_meta_stringdata_QTreeView,
qt_meta_data_QTreeView, 0 }
};
我只是觉得奇怪的是,当我尝试使用 QTreeView 文件构建时,它们本身会出错。
无论如何,警告告诉我 QTreeView 的构造函数已经定义。我的所有头文件都有保护,所以我想不出它会认为 QTreeView 被定义了两次。
更新:20110710_1612
这里是 QTreeView.h 的开头,其中包含 QTreeView 的定义。请注意,它包含 QAbstractItemView.h 并继承自它。
#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
{
...
以完全相同的方式,我的自定义类继承自它。
#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
{
更新:20110710_1757
我突然意识到我从 QTreeView 复制的代码是用于库的,我不是在构建库,只是为我的应用程序构建 .exe。我从构造函数中删除了 Q_GUI_EXPORT(就在上面),我遇到的警告消失了。
现在我在处理 moc_CustomTreeView.cpp 文件时遇到错误(总共有 3 个错误,都像这个):
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
这是有问题的代码:
case 16: d_func()->_q_endAnimatedOperation(); break;
不确定如何处理 moc_ 文件错误。 d_func() 抓取了 CustomTreeViewPrivate 实例,但是 moc_ 文件范围看不到。
更新:20110710_1757
看了一圈了解moc_文件和Qt的开发方式,找到了这两个。 KDE Techbase Policies/Library Code Policy 这个解释了为什么 Qt 代码是按原样编写的,使用私有类等。
我还找到了以下页面,该页面解释了当你的 moc_ 代码给你类似我上面的错误时该怎么做(重新运行 qmake)Using the Meta-Object Compiler (moc)。我试过了,上面的 moc_ 错误消失了,现在我看到了这些。
顺便说一下,我把 CustomTreeView 的名字改成了 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
【问题讨论】:
-
这个问题变得杂乱无章(这是我的错,因为我现在正在尝试两种方法。)我会将涉及从 QTreeView 继承的第二种方法移到另一个问题。