Где ошибка в моем коде? - PullRequest
       24

Где ошибка в моем коде?

2 голосов
/ 22 февраля 2010

Я хочу создать настраиваемое представление списка, в котором я буду добавлять элементы динамически, Я написал код для того же, но это доставляет мне некоторые проблемы,

  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 @@ 6B @ ~) 'в main.o mwldsym2.exe: неопределенный символ: 'struct QMetaObject const * Test :: metaObject (void) const (? metaObject @ Test @@ UBEPBUQMetaObject @@ XZ)' mwldsym2.exe: ссылка из 'const Test :: `vftable' (?? _ 7Test @@ 6B @ ~) 'в main.o

Ответы [ 3 ]

4 голосов
/ 22 февраля 2010

Судя по сообщениям об ошибках, я должен был догадаться, что вы забыли запустить moc .

3 голосов
/ 23 февраля 2010

Убедитесь, что заголовок, в котором находится класс Test, добавлен в переменную HEADERS в файле проекта. Как это:

HEADERS + = Test.h

Перезапустите qmake и сделайте.

Godspeed

0 голосов
/ 23 февраля 2010

Вы не указали, на какой платформе вы разрабатываете.

Если вы используете Linux или Mac, генерируете ли вы свой Makefile с помощью qmake? Если нет, то вы, вероятно, пропускаете некоторые важные для Qt шаги. Например, все производные от Qt классы должны запускаться через мета-объектный компилятор (moc.). Это предоставляет классу специфические функциональные возможности, предоставляемые Qt, которые не являются частью C ++ (например, слоты, сигналы и т. ) если я правильно помню.

Убедитесь, что у вас есть файл проекта Qt (.pro). Исходя из этого, вы можете сгенерировать файл GNU make, используя QMake.

Как правило, вы хотите запустить:

QMAKE сделать

для создания приложения при добавлении новых исходных файлов. В противном случае вы можете просто запустить «make».

...