Russian Qt Forum

Программирование => С/C++ => Тема начата: theorist от Июнь 02, 2010, 15:50



Название: invalid use of incomplete type (решено)
Отправлено: theorist от Июнь 02, 2010, 15:50
здравствуйте!
оказался в тупике, хотя решение, наверняка, насколько простое, что сам, наверное, буду долго смеяться ...

итак, пытаюсь в Qt Creator сделать программу, а вместо неё получаю следующее:

Цитировать
.../mainwindow.cpp:38: ошибка: invalid use of incomplete type ‘struct TableModel’
.../mainwindow.h:11: ошибка: forward declaration of ‘struct TableModel’
.../mainwindow.cpp:39: ошибка: нет подходящей функции для вызова ‘QTableView::setModel(TableModel*&)’

сам код такой:

Код:
...
//mainwindow.cpp

#include <QTableView>
...
#include "mainwindow.h"
#include "tablemodel.h"

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
createCentralWdgt();
...
}
...
void MainWindow::createCentralWdgt()
{
tableView = new QTableView();
tableModel = new TableModel();
tableView->setModel(tableModel);
setCentralWidget(tableView);
}
...

Код:
...
//mainwindow.h

#include <QtGui/QMainWindow>

class QTableView;
class TableModel;

class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
...

private:
...
QTableView *tableView;
TableModel *tableModel;
...
void createCentralWdgt();
...
};
...

Код:
...
//tablemodel.h

#include <QAbstractTableModel>

class TableModel : public QAbstractTableModel
{
Q_OBJECT
public:
TableModel(QObject* = 0);
int rowCount(const QModelIndex& = QModelIndex()) const;
int columnCount(const QModelIndex& = QModelIndex()) const;
QVariant data(const QModelIndex&, int = Qt::DisplayRole) const;
QVariant headerData(int, Qt::Orientation, int = Qt::DisplayRole) const;
Qt::ItemFlags flags(const QModelIndex&) const;
bool insertRows(int, int, const QModelIndex& = QModelIndex());
bool removeRows(int, int, const QModelIndex& = QModelIndex());
bool insertColumns(int, int, const QModelIndex& = QModelIndex());
bool removeColumns(int, int, const QModelIndex& = QModelIndex());
...
};
...

Код:
...
//tablemodel.cpp

#include "tablemodel.h"

TableModel::TableModel(QObject *parent) : QAbstractTableModel(parent) {...}
int TableModel::rowCount(const QModelIndex &parent) const {...}
int TableModel::columnCount(const QModelIndex &parent) const {...}
QVariant TableModel::data(const QModelIndex &index, int role) const {...}
QVariant TableModel::headerData(int section, Qt::Orientation orientation, int role) const {...}
Qt::ItemFlags TableModel::flags(const QModelIndex &index) const {...}
bool TableModel::insertRows(int position, int rows, const QModelIndex &index) {...}
bool TableModel::removeRows(int position, int rows, const QModelIndex &index) {...}
bool TableModel::insertColumns(int position, int columns, const QModelIndex &index) {...}
bool TableModel::removeColumns(int position, int columns, const QModelIndex &index) {...}

прошу помощи  ???


Название: Re: invalid use of incomplete type
Отправлено: ритт от Июнь 02, 2010, 18:39
а весь файл tablemodel.h можно?


Название: Re: invalid use of incomplete type
Отправлено: theorist от Июнь 02, 2010, 19:08
а весь файл tablemodel.h можно?
конечно, хотя, в принципе, он практически соответствует уже выложенному. вот:

Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QAbstractTableModel>

class TableModel : public QAbstractTableModel
{
Q_OBJECT
public:
TableModel(QObject* = 0);
int rowCount(const QModelIndex& = QModelIndex()) const;
int columnCount(const QModelIndex& = QModelIndex()) const;
QVariant data(const QModelIndex&, int = Qt::DisplayRole) const;
QVariant headerData(int, Qt::Orientation, int = Qt::DisplayRole) const;
Qt::ItemFlags flags(const QModelIndex&) const;
bool insertRows(int, int, const QModelIndex& = QModelIndex());
bool removeRows(int, int, const QModelIndex& = QModelIndex());
bool insertColumns(int, int, const QModelIndex& = QModelIndex());
bool removeColumns(int, int, const QModelIndex& = QModelIndex());
private:
QList<QStringList> array;
};

#endif // MAINWINDOW_H


Название: Re: invalid use of incomplete type
Отправлено: Rcus от Июнь 02, 2010, 19:13
Copy-paste умеет не только ракеты ронять.
Copy-paste умеет не только ракеты ронять

/* смотрит на include guards */


Название: Re: invalid use of incomplete type
Отправлено: theorist от Июнь 02, 2010, 19:41
Copy-paste умеет не только ракеты ронять.
Copy-paste умеет не только ракеты ронять

/* смотрит на include guards */
спасибо! я же говорил, что сам буду смеяться  ;D


Название: Re: invalid use of incomplete type (решено)
Отправлено: Igors от Июнь 02, 2010, 20:11
Не понял, прошу объяснить где ошибка (я ее не нашел)


Название: Re: invalid use of incomplete type (решено)
Отправлено: theorist от Июнь 02, 2010, 20:34
Не понял, прошу объяснить где ошибка (я ее не нашел)

Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
...
#endif // MAINWINDOW_H
а файл называется tablemodel.h. правда, смешно? :D


Название: Re: invalid use of incomplete type (решено)
Отправлено: ритт от Июнь 03, 2010, 00:34
почему и просил весь файл...


Название: Re: invalid use of incomplete type (решено)
Отправлено: theorist от Июнь 03, 2010, 08:14
почему и просил весь файл...
спасибо за наводку, Константин! но без дополнительной подсказки я бы, наверное, ни за что не догадался бы, что причина проблемы кроется именно в директивах препроцессора. впредь буду обращать на них больше внимания.

думаю, что тему лучше перенести в раздел "Программирование: C/C++"


Название: Re: invalid use of incomplete type (решено)
Отправлено: Igors от Июнь 04, 2010, 15:15
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
...
#endif // MAINWINDOW_H
а файл называется tablemodel.h. правда, смешно? :D
Спасибо, теперь понял  :)


Название: Re: invalid use of incomplete type (решено)
Отправлено: Mityai от Август 12, 2010, 14:45
Ребят, спасибо большое за эту тему! Я наконец-то понял как QTableView связать с QAbstractTableModel ;D


Название: Re: invalid use of incomplete type (решено)
Отправлено: dee от Декабрь 09, 2011, 14:21
Была аналогичная проблема.

Оказалось, при изменении objectName кнопки на форме (при магическом стечении обстоятельств по радиусу кривизны рук) была переименована не кнопка, а вся форма, в результате чего вылетало такое сообщение об ошибке.

Мораль:
БУДЬ ВНИМАТЕЛЕН!