我的代码中的错误在哪里?
Posted
技术标签:
【中文标题】我的代码中的错误在哪里?【英文标题】:Where is the mistake in my code? 【发布时间】:2010-02-22 13:35:39 【问题描述】:我想制作一个自定义列表视图,我将动态添加项目, 我已经编写了相同的代码,但它给了我一些问题,
-
代码编译正常,但会出现一些链接器错误,
我通过保留不同的头文件尝试了相同的代码,它运行良好,但我无法控制我的委托类。
请您提出错误可能是什么?
#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@~)'
【问题讨论】:
我建议让您的问题标题更具信息性。 关于未定义符号错误:您要么没有在定义 Test 类的文件上运行 moc,要么在 Test 类的开头没有 Q_OBJECT 宏。由于您仅在此处显示 ItemDelegate 类,因此该问题可能在您的代码中的其他地方。 另外,您确定在要控制的视图上安装了委托类的实例吗?有时我们会犯一些简单的错误...... 【参考方案1】:从错误消息来看,我不得不猜测您忘记运行moc。
【讨论】:
嘿..我是 QT 的新手,请你给我一个确切的解决方案,我该如何解决。我不只是:(【参考方案2】:确保将 Test 类所在的标头添加到项目文件中的 HEADERS 变量中。像这样:
标题 += 测试.h
重新运行 qmake 和 make。
神速
【讨论】:
是的,我测试了.. 通过创建头文件和 CPP 它运行良好.. 但我面临的问题是将项目添加到列表中。控件不会只委托方法.. 我在上面的代码中提到了添加过程 对不起,我不太明白你在说什么。由于您的问题 1 已经解决(将 Test 类声明移动到单独的头文件中并将其添加到您的 .pro 文件中,重新运行 qmake)我认为您应该写一个关于任何不起作用的新问题(我不知道您所说的“控制不会仅委托方法”的意思)。大多数人(包括我)只会查看您的链接器错误并做出响应。【参考方案3】:您没有指定您正在开发的平台。
如果您使用的是 Linux 或 Mac,您是否使用 qmake 生成您的 Makefile?如果没有,您可能会遗漏一些重要的 Qt 特定步骤。例如,所有 Qt 派生的类都需要通过元对象编译器 (moc) 运行。这为该类提供了 Qt 提供的特定功能,而不是 C++ 的一部分(例如槽、信号等, ) 如果我没记错的话。
确保您有一个 Qt 项目 (.pro) 文件。由此,您可以使用 QMake 生成 GNU make 文件。
通常,您需要运行:
qmake 制作
在您添加新的源文件时构建您的应用程序。否则你可以运行“make”。
【讨论】:
以上是关于我的代码中的错误在哪里?的主要内容,如果未能解决你的问题,请参考以下文章
此代码在 DevC++ 中编译没有问题,但 Visual Studio 2008 发出这些警告并拒绝编译。我的错误在哪里?