Я хочу, чтобы настраиваемое представление списка, в том, что я буду добавлять элементы динамически, я написал код для того же самого, но это дает мне некоторые проблемы,Где ошибка в моем коде?
- код компилирует хорошо, но это даст некоторые linker error,
- Я пробовал один и тот же код, сохраняя разные файлы заголовков, он работает хорошо, но я не получаю контроль только за свой класс делегата.
Пожалуйста, можете ли вы предложить, какими могут быть ошибки?
#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
Я бы предложил сделать заголовок вашего вопроса более информативным. – tonylo
Об ошибках неопределенного символа. Вы либо не используете moc в файле, который определяет класс Test, либо у вас нет макроса Q_OBJECT в начале класса Test. Поскольку здесь отображается только класс ItemDelegate, эта проблема, вероятно, находится в другом месте вашего кода. –
Кроме того, вы уверены, что вы установили экземпляр вашего класса делегата в режиме просмотра? Иногда простые ошибки - это те, которые мы делаем ... –