2010-02-22 4 views
2

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

  1. код компилирует хорошо, но это даст некоторые linker error,
  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: Неопределенный символ: 'пустота * Test :: qt_metacast (символ сопз *) (qt_metacast @ Test @@ UAEPAXPBD @ Z?)' mwldsym2.exe: ссылки из «сопзЬ Test :: vftable '(?? _ 7Test @@ 6B @ ~)' в main.o mwldsym2.exe: Неопределенный символ: 'struct QMetaObject const * Test :: metaObject (void) const (? MetaObject @ Test @@ UBEPBUQMetaObject @@ XZ)' mwldsym2.exe: ссылки из 'сопзЬ Test :: `vftable' (?? _ 7Test @@ 6В @ ~)» в main.o

+1

Я бы предложил сделать заголовок вашего вопроса более информативным. – tonylo

+0

Об ошибках неопределенного символа. Вы либо не используете moc в файле, который определяет класс Test, либо у вас нет макроса Q_OBJECT в начале класса Test. Поскольку здесь отображается только класс ItemDelegate, эта проблема, вероятно, находится в другом месте вашего кода. –

+0

Кроме того, вы уверены, что вы установили экземпляр вашего класса делегата в режиме просмотра? Иногда простые ошибки - это те, которые мы делаем ... –

ответ

4

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

+0

Эй ..Я новичок в QT, Можете ли вы, пожалуйста, дать мне точное решение, как я могу решить то же самое. Я не получаю только :( – Naruto

3

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

HEADERS + = test.h

Rerun QMAKE и сделать.

Godspeed

+0

ya ,, i тестировал .. путем создания файла заголовка и CPP он работал хорошо .. но проблема, с которой я столкнулся, - это добавить элемент в список. Управление не собирается делегировать только методы. i hv упомянула процедуру добавления выше кода – Naruto

+0

Прошу прощения, я не совсем понимаю, что вы говорите. Поскольку ваш номер вопроса 1 уже разрешен (переместите объявление Test class в отдельный заголовочный файл и добавьте его в свой .pro file, rerun qmake) Я думаю, вы должны написать новый вопрос о том, что не работает (я не знаю, что вы подразумеваете под «контролем не собирается делегировать только методы»). Большинство людей (включая меня) будут просто посмотрите на ошибку компоновщика и ответьте на это. – eburger

0

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

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

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

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

QMAKE сделать

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

Смежные вопросы