2016-01-01 2 views
-1

У меня есть небольшая проблема:Invalide использование неполного типа Qt

finddialog.h

#ifndef FINDDIALOG_H 
#define FINDDIALOG_H 

class QDialog; 
class QWidget; 
class QLineEdit; 
class QPushButton; 
class QCheckBox; 
class QLabel; 

class FindDialog : public QDialog 
{ 
    Q_OBJECT 


public: 
    FindDialog(QWidget *parent); 

private slots: 
    void findClicked(); 
    void enableFindButton(const QString &text); 

signals : 
    void findNext(const QString &str, Qt::CaseSensitivity cs); 
    void findPrev(const QString &str, Qt::CaseSensitivity cs); 

private: 
    QLabel *findLabel; 
    QLineEdit *textEdit; 
    QCheckBox *caseCheckBox; 
    QCheckBox *backwCheckBox; 
    QPushButton *findButton; 
    QPushButton *closeButton; 

}; 

#endif // FINDDIALOG_H 

finddialog.c

#include <QtWidgets> 
#include "finddialog.h" 


FindDialog::FindDialog(QWidget *parent) : QDialog(parent) 
{ 
    QPushButton *button = new QPushButton(this); 
} 

void FindDialog::findClicked() 
{ 

} 

void FindDialog::enableFindButton(const QString &text) 
{ 

} 

Я получаю QDialog/QPushButton недействительны использование ошибки неполного типа.

Я уже включил QtWidget в .cpp файл, так почему он не работает?

ответ

2

(Forward) декларации недостаточно для типа базового класса. Вы должны обеспечить определение (сделать QDialog полный тип), так:

#include <QDialog> 

в файле заголовка. См. Forward Declaration of a Base Class.

Основываясь на коде, который вы отправили, я не знаю, где ошибка в размере QPushButton, которая является неполной, исходит из (если вы, конечно, #include <QtWidgets>).

Если вы не #include <QtWidgets> (который имеет #include <QPushButton>, и т.д ...), вы не можете создать экземпляр любого из этих неполных типов, например, так:

new QPushButton(this); 

Это опять же, требует определения (Что размер требуется память QPushButton? Какой конструктор для вызова? Это известно только в том случае, если в этом блоке компиляции есть определение - файл .cpp).

+0

Для большей ясности это не декларация, это декларация. – skypjack

+0

@skypjack «forward» просто указывает на использование, не так ли? Это все еще декларация. – LogicStuff

+0

@LogicStuff * Для ясности * –

0

Вперед декларация QPushButton и другие в finddialog.h, компилятор рассчитывает найти их конструкторы и другие методы в некоторых связанных файлах.
#include необходимые файлы заголовков, чтобы заставить его работать.

+0

Нет, указатель на неполный типы разрешены. – LogicStuff

+0

есть. Но не будет работать без * полноты * –

+0

@jafar нет встроенного метода, дешифровавшего указатель в файле заголовка, а в исходном файле я включил karim

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