2011-07-10 18 views
0

私はQt 4.7のC++チュートリアルを終了し、QTreeViewの機能の一部を拡張するプロジェクトを開始しました。既存のQtクラスからクラスを作成する

私は次の操作を実行しようとしています:

  1. プログラムの確保がQTreeView
  2. コピーを使用して正常に動作し、.. \ SRC \ GUI \ itemviews \ qtreeview.cpp、qtreeviewに基づいて新しいファイルを貼り付けます.H、および

私はMSVCを使用して、次の警告を(取得しています(.PROファイルを含む)各ファイル名には、各ファイルの中に "QTreeView" を "CustomTreeView" を置き換える

  • 、commanをqtreeview_p.h d行):

    .\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' 
    

    以上がCustomTreeViewとQTreeViewを置き換える以外は変更せずに(qtreeview.hに)以下の等価不満される:

    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_1339

    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_0926にエラーが発生し、実際のコードで、私は以前のように(、qmakeは使用してコンパイルしようとした

    )私のカスタムクラスを.. \ src \ gui \ itemviews \のqtreeviewファイルに置き換えると、私は非常によく似た警告を受けました。 「{CTOR}」の

    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 
    

    このしようとして表示された唯一の誤差があり、それが関係している(オンザフライでコンパイルされている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 
    

    警告の原因に関連するものがあればわかりません。ここでは、コードのsnippitは次のとおりです。

    const QMetaObject QTreeView::staticMetaObject = { 
        { &QAbstractItemView::staticMetaObject, qt_meta_stringdata_QTreeView, 
         qt_meta_data_QTreeView, 0 } 
    }; 
    

    私はちょうどそれは奇妙なQTreeViewが、私は彼らと一緒に構築しようとするとエラー出力ファイル自体ことがわかります。

    とにかく、QTreeViewのコンストラクタが既に定義されているという警告が表示されます。私はすべてのヘッダファイルについて警備員を抱えているので、QTreeViewが2回定義されたと思うとは思えません。更新

    :20110710_1612

    をここではQTreeViewの定義とQTreeView.hの始まりです。 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つのエラー、すべてがあります):

    case 16: d_func()->_q_endAnimatedOperation(); break; 
    

    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 
    

    はここで問題のあるコードですmoc_ファイルエラーについて何をすべきか分かりません。 d_func()はCustomTreeViewPrivateインスタンスを取得しますが、moc_ファイルのスコープはそれを見ることができません。

    を更新:20110710_1757

    を私はmoc_ファイルや開発のQtの道を理解するために周りを見回したとこれら二つのを見つけました。 KDE Techbase Policies/Library Code Policy Qtコードをそのままプライベートクラスなどを使って記述する理由を説明しています。

    また、moc_コードが上記のようなエラー(rerun qmake)、Using the Meta-Object Compiler (moc)を与えたときの対処方法についても説明しています。私はこれを試して、上記のmoc_エラーは消えて、今私はこれらを提示されます。

    さて、私は、CustomTreeViewの名前をSummaryDrillDownTreeView2に変更しました。

    SummaryDrillDownTreeView2.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall QAbstractItemViewPrivate::~QAbstractItemViewPrivate(void)" ([email protected]@[email protected]) referenced in function [email protected]@[email protected]$0 
    SummaryDrillDownTreeView2.obj : error LNK2019: unresolved external symbol "public: __thiscall QAbstractItemViewPrivate::QAbstractItemViewPrivate(void)" ([email protected]@[email protected]) referenced in function "public: __thiscall SummaryDrillDownTreeView2Private::SummaryDrillDownTreeView2Private(void)" ([email protected]@[email protected]) 
    SummaryDrillDownTreeView2.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall QAbstractItemViewPrivate::_q_rowsRemoved(class QModelIndex const &,int,int)" ([email protected]@@[email protected]@[email protected]) 
    SummaryDrillDownTreeView2.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall QAbstractItemViewPrivate::_q_columnsInserted(class QModelIndex const &,int,int)" ([email protected]@@[email protected]@[email protected]) 
    SummaryDrillDownTreeView2.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall QAbstractItemViewPrivate::_q_layoutChanged(void)" ([email protected]@@UAEXXZ) 
    SummaryDrillDownTreeView2.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall QAbstractItemViewPrivate::selectAll(class QFlags<enum QItemSelectionModel::SelectionFlag>)" ([email protected]@@[email protected]@[email protected]@@@@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 " ([email protected]@@[email protected]@@[email protected]@[email protected]@[email protected]@@Z) 
    SummaryDrillDownTreeView2.obj : error LNK2019: unresolved external symbol "public: void __thiscall QAbstractItemViewPrivate::doDelayedItemsLayout(int)" ([email protected]@@[email protected]) referenced in function "public: void __thiscall SummaryDrillDownTreeView2::setRowHidden(int,class QModelIndex const &,bool)" ([email protected]@@[email protected]@[email protected]) 
    SummaryDrillDownTreeView2.obj : error LNK2019: unresolved external symbol "public: void __thiscall QAbstractItemViewPrivate::interruptDelayedItemsLayout(void)const " ([email protected]@@QBEXXZ) referenced in function "public: void __thiscall SummaryDrillDownTreeView2::expandAll(void)" ([email protected]@@QAEXXZ) 
    SummaryDrillDownTreeView2.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall QAbstractItemViewPrivate::_q_modelDestroyed(void)" ([email protected]@@UAEXXZ) referenced in function "public: virtual void __thiscall SummaryDrillDownTreeView2Private::_q_modelDestroyed(void)" ([email protected]@@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 " ([email protected]@@[email protected][email protected]@@[email protected]@@@@@[email protected]@@@@[email protected]@@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 " ([email protected]@@[email protected][email protected]@@[email protected]@@@@@[email protected]@@@@[email protected]@@Z) 
    SummaryDrillDownTreeView2.obj : error LNK2019: unresolved external symbol "public: class QStyleOptionViewItemV4 __thiscall QAbstractItemViewPrivate::viewOptionsV4(void)const " ([email protected]@@[email protected]@XZ) referenced in function "protected: void __thiscall SummaryDrillDownTreeView2::drawTree(class QPainter *,class QRegion const &)const " ([email protected]@@[email protected]@[email protected]@@Z) 
    SummaryDrillDownTreeView2.obj : error LNK2019: unresolved external symbol "public: struct QEditorInfo __thiscall QAbstractItemViewPrivate::editorForIndex(class QModelIndex const &)const " ([email protected]@@[email protected]@[email protected]@@Z) referenced in function "protected: virtual void __thiscall SummaryDrillDownTreeView2::drawRow(class QPainter *,class QStyleOptionViewItem const &,class QModelIndex const &)const " ([email protected]@@[email protected]@[email protected]@[email protected]@@Z) 
    SummaryDrillDownTreeView2.obj : error LNK2019: unresolved external symbol "public: void __thiscall QFramePrivate::updateStyledFrameWidths(void)" ([email protected]@@QAEXXZ) referenced in function "public: void __thiscall SummaryDrillDownTreeView2Private::initialize(void)" ([email protected]@@QAEXXZ) 
    SummaryDrillDownTreeView2.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall QAbstractItemViewPrivate::_q_columnsAboutToBeRemoved(class QModelIndex const &,int,int)" ([email protected]@@[email protected]@[email protected]) referenced in function "public: virtual void __thiscall SummaryDrillDownTreeView2Private::_q_columnsAboutToBeRemoved(class QModelIndex const &,int,int)" ([email protected]@@[email protected]@[email protected]) 
    SummaryDrillDownTreeView2.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall QAbstractItemViewPrivate::_q_columnsRemoved(class QModelIndex const &,int,int)" ([email protected]@@[email protected]@[email protected]) referenced in function "public: virtual void __thiscall SummaryDrillDownTreeView2Private::_q_columnsRemoved(class QModelIndex const &,int,int)" ([email protected]@@[email protected]@[email protected]) 
    debug\cashflow.exe : fatal error LNK1120: 16 unresolved externals 
    
  • +0

    QTreeViewから継承する2番目のアプローチを別の質問に移します。これは私の現在の問題です。 – jetimms

    答えて

    1

    は、私は本当にMSVCについて言うことはできませんが、それらのメンバーは、エラーが言うように、QAbstractTreeViewのための保護として宣言されています。あなたはエラーに関連するソースを貼り付けていませんでしたが、どういうわけか、サブクラスの使用法としての資格を持たない保護されたメンバーを使用しようとしていると思います。

    EDIT:

    if ((state != QAbstractItemView::NoState 
    

    これはエラーの原因となっている実際の線です。ここでは、QAbstractViewの保護されたメンバーを使用しています。これは許可されていません。保護されたメンバーは純粋にサブクラスとして使用できます。

    クラスがQAbstractViewを継承している場合は、そのメンバーを使用できます。

    +0

    コードを編集して追加しますが、これはQTreeViewヘッダーファイル(上記参照)に含まれているものとほぼ同じです。 – jetimms

    +0

    あなたは正しいですか? QAbstractItemView.hに 'NoState'タイプが設定されているStateという保護された列挙型が見つかりました。しかし、QTreeViewと私のカスタムクラスは両方ともQAbstractItemViewを継承しているので、2番目の試みから起こっているように、QTreeViewだけでなく、両方ともこの列挙型を使用できると思います。 QTreeView.hファイルのクラス宣言と少数の進行中のマクロを上記の質問に追加します。 – jetimms

    +1

    QAbstr ... :: NoStateではなく、CustomTreeView :: NoStateのように使用する必要があります。後者では、そのクラスの一部ではないので、パブリックな方法で使用します。 – Smar

    6

    コピーして貼り付けるのではなく、新しいクラスを作成するために継承を使用する必要があります。その方法を維持するためのコードが少なくて済み、マイナーなQtアップグレードでも壊れにくい。

    +0

    これは私が最初に試みたものでしたが、私が変更したいQTreeViewのメソッドは仮想ではありません。継承された非仮想メソッドを再定義することは慣行に反すると思った。 – jetimms

    +1

    あなたは何をしようとしているのか分からず、そのことは言うことができません。あなたは本当にツリービューをお望みですか? – Bill99

    +0

    上記で説明します。 – jetimms

    関連する問題