我想制作一个自定义列表视图,因为我会动态添加项目, 我已经编写了相同的代码,但它给了我一些问题,
请问你可以说明错误是什么?
#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 @〜)'
答案 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。”