我的代码中的错误在哪里?

时间:2010-02-22 13:35:40

标签: qt qt4 symbian nokia

我想制作一个自定义列表视图,因为我会动态添加项目, 我已经编写了相同的代码,但它给了我一些问题,

  1. 代码编译正常,但会产生一些链接器错误,
  2. 我通过保留不同的头文件尝试了相同的代码,它运行良好,但我无法控制到我的委托类。
  3. 请问你可以说明错误是什么?

    #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:在main.o中引用'const Test :: vftable'(?? _ 7Test @@ 6B @〜)'       mwldsym2.exe:未定义的符号:'struct QMetaObject const * Test :: metaObject(void)const(?metaObject @ Test @@ UBEPBUQMetaObject @@ XZ)'       mwldsym2.exe:在main.o中引用'const Test ::`vftable'(?? _ 7Test @@ 6B @〜)'

3 个答案:

答案 0 :(得分:4)

从错误消息判断我不得不猜测你忘了运行moc

答案 1 :(得分:3)

确保Test类所在的标题添加到项目文件中的HEADERS变量中。像这样:

HEADERS + = Test.h

重新运行qmake并制作。

一帆风顺

答案 2 :(得分:0)

您没有指定您正在开发的平台。

如果您使用的是Linux或Mac,是否使用qmake生成Makefile?如果没有,您可能会遗漏一些重要的Qt特定步骤。例如,所有Qt派生类都需要通过元对象编译器(moc。)运行。这为类提供了Qt提供的不属于C ++的特定功能(例如插槽,信号等,如果我没记错的话。

确保您有一个Qt项目(.pro)文件。从这里,您可以使用QMake生成GNU make文件。

通常,您需要运行:

的qmake 使

在添加新源文件时构建应用程序。否则你可以运行“make。”