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

4

3 回答 3

4

从错误消息来看,我不得不猜测您忘记运行moc

于 2010-02-22T13:42:36.753 回答
3

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

标题 += 测试.h

重新运行 qmake 并制作。

神速

于 2010-02-23T05:28:18.100 回答
0

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

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

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

通常,您需要运行:

qmake 制作

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

于 2010-02-23T05:38:47.423 回答