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

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”。

【讨论】:

以上是关于我的代码中的错误在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

在哪里定义 C++ 中的错误代码常量

我的 SQL 插入错误在哪里?

此代码在 DevC++ 中编译没有问题,但 Visual Studio 2008 发出这些警告并拒绝编译。我的错误在哪里?

如何在致命信号 11 之后使用 logcat 中的输出来找出我在 android 本机代码中从哪里得到错误?

我如何解析 Json 对象或数组?我的代码哪里出错了?

Sails JS 护照 http 401