2

アイテムを動的に追加するという点で、カスタマイズされたリストビューを作成したいのですが、同じコードを記述しましたが、いくつかの問題が発生します。

  1. コードは正常にコンパイルされていますが、リンカーエラーが発生します。
  2. 異なるヘッダーファイルを保持して同じコードを試しましたが、正常に実行されますが、デリゲートクラスのみを制御できません。

間違いが何であるかを提案できますか?

#include <QtGui>
#include <QApplication>
#include <QtGui/QMainWindow>

class ItemDeligate:public QStyledItemDelegate
{
public:
    ItemDeligate(QObject *parent = 0):QStyledItemDelegate(parent)
    {
    }

    ~ItemDeligate()
    {
    }

public:
    enum ItemDataRole { SubTextRole = Qt::UserRole + 100 };

    QSize sizeHint( const QStyleOptionViewItem& option,
                    const QModelIndex& index ) const;

    void paint( QPainter* painter,
                const QStyleOptionViewItem& option,
                const QModelIndex& index ) const;
};

QSize ItemDeligate::sizeHint( const QStyleOptionViewItem& option,
                              const QModelIndex &index) const
{
    // here i know implimentation
}

void ItemDeligate::paint( QPainter* p,
                          const QStyleOptionViewItem& option,
                          const QModelIndex& index ) const
{
    // here i know the implimentation
    QStyledItemDelegate::paint(p,option,index);
}

class Test : public QMainWindow
{
    Q_OBJECT

public:
    Test(QWidget *parent = 0);
    ~Test()
    {
    }

    QPixmap GreenPixmap;
    QList<QStandardItem *> ItemList;
    QStandardItemModel *ListModel;    
    QVBoxLayout Listlayout;    
    QListView *MylistView;    
    QAction *AddItemMenu;

public slots:
    void addItem();
};

Test::Test(QWidget *parent)
    : QMainWindow(parent)
{
    MylistView = new QListView();
    QDesktopWidget* desktopWidget = QApplication::desktop();
    QRect clientRect = desktopWidget->geometry();

    MylistView->setMinimumSize( QSize( clientRect.width() - 7,
                                       clientRect.height() - 1 ) );

    MylistView->setViewMode(QListView::ListMode);
    MylistView->setMovement(QListView::Free);
    MylistView->setItemDelegate(new ItemDeligate(MylistView));
    MylistView->setSelectionMode(QAbstractItemView::SingleSelection);

    bool val = GreenPixmap.load(":/new/prefix1/temp/test.png");

    ListModel = new QStandardItemModel();
    ListModel->appendColumn(ItemList);    
    MylistView->setModel(ListModel); 
    Listlayout.addWidget(MylistView);
    Listlayout.addWidget(MylistView);    
    this->setLayout(&Listlayout);
    AddItemMenu = new QAction("Add",this);    
    menuBar()->addAction(AddItemMenu); 
    val = connect(AddItemMenu,SIGNAL(triggered()),this,SLOT(addItem()));
}

void Test::addItem()
{
    QStandardItem *Items = new QStandardItem(QIcon(GreenPixmap),"Avatar");
    Items->setData("WAKE UP",ItemDeligate::SubTextRole);
    ItemList.append(Items);
    ListModel->appendColumn(ItemList);
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Test test;
    test.showMaximized();
    test.showMaximized();

    return a.exec();
}

エラーが発生したため、ツールが異常終了しました。

mwldsym2.exe:未定義のシンボル:'void * Test :: qt_metacast(char const *)(?qt_metacast @ Test @@ UAEPAXPBD @ Z)' mwldsym2.exe:'const Test :: vftable'(?? _ 7Test @@ 6B @〜)'main.o mwldsym2.exe:未定義のシンボル:' struct QMetaObject const * Test :: metaObject(void)const(?metaObject @ Test @@ UBEPBUQMetaObject @@ XZ)'mwldsym2.exe:'constから参照main.oのTest::`vftable'(?? _ 7Test @@ 6B @〜)'

4

3 に答える 3

4

エラー メッセージから判断すると、 mocを実行するのを忘れていたと推測する必要があります。

于 2010-02-22T13:42:36.753 に答える
3

Test クラスがあるヘッダーが、プロジェクト ファイルの HEADERS 変数に追加されていることを確認します。このような:

ヘッダー += Test.h

qmake と make を再実行します。

ゴッドスピード

于 2010-02-23T05:28:18.100 に答える
0

開発しているプラ​​ットフォームを指定していません。

LinuxまたはMacを使用している場合、qmakeを使用してMakefileを生成していますか?そうでない場合は、Qt固有の重要な手順が欠落している可能性があります。たとえば、すべてのQt派生クラスは、メタオブジェクトコンパイラ(moc)を介して実行する必要があります。これにより、C ++の一部ではないQtが提供する特定の機能(スロット、シグナルなど)がクラスに提供されます。 )正しく思い出せば。

Qtプロジェクト(.pro)ファイルがあることを確認してください。これから、QMakeを使用してGNUmakeファイルを生成できます。

通常、次のコマンドを実行します。

qmake make

新しいソースファイルを追加するたびにアプリケーションをビルドします。それ以外の場合は、「make」を実行できます。

于 2010-02-23T05:38:47.423 に答える