Hell Man
Hell Man

Reputation: 873

Qt Error: QHBoxLayout was not declaredin this scope?

I am trying to compile the following using Qt 4 but I get errors. I researched many sources but I have not been able to solve the problem. See Code below. This program is from Qt 4 textbook. The code works according to them.

.pro file

HEADERS += \
    findDialog.h

SOURCES += \
    findDialog.cpp \
    main.cpp

QT += widgets \
      gui

FindDialog.h

#ifndef FINDDIALOG_H
#define FINDDIALOG_H

#include <QDialog>

class QCheckbox;
class QLabel;
class QLineEdit;
class QPushButton;

class FindDialog : public QDialog
{
    Q_OBJECT

public:
    FindDialog(QWidget *parent = 0);

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

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

private:
    QLabel *label;
    QLineEdit *lineEdit;
    QCheckbox *caseCheckBox;
    QCheckbox *backwardCheckBox;
    QPushButton *findButton;
    QPushButton *closeButton;
};

#endif

FindDialog.cpp

#include <QtGui>
#include "findDialog.h"
#include <QCheckBox>

FindDialog::FindDialog(QWidget *parent) : QDialog(parent)
{
    label = new QLabel(tr("Find &what"));
    lineEdit = new QLineEdit;
    label->setBuddy(lineEdit);
    caseCheckBox = new QCheckbox(tr("Match &case"));
    backwardCheckBox = new QCheckbox(tr("Search &backward"));
    findButton = new QPushButton(tr("&Find"));
    findButton->setDefault(true);
    findButton->setEnabled(false);
    closeButton = new QPushButton(tr("Close"));

    connect(lineEdit, SIGNAL(textChanged(const QString &)),
            this, SLOT(enableFindButton(const QString &)));

    connect(findButton, SIGNAL(clicked()),
            this, SLOT(findClicked()));

    connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));

    QHBoxLayout *topLeftLayout = new QHBoxLayout();
    topLeftLayout->addWidget(label);
    topLeftLayout->addWidget(lineEdit);

    QVBoxLayout *leftLayout = new QVBoxLayout();
    leftLayout->addLayout(topLeftLayout);
    leftLayout->addWidget(caseCheckBox);
    leftLayout->addWidget(backwardCheckBox);

    QVBoxLayout *rightLayout = new QVBoxLayout();
    rightLayout->addWidget(findButton);
    rightLayout->addWidget(closeButton);
    rightLayout->addStretch();

    QHBoxLayout *mainLayout = new QHBoxLayout();
    mainLayout->addLayout(leftLayout);
    mainLayout->addLayout(rightLayout);
    setLayout(mainLayout);

    setWindowTitle(tr("Find"));
    setFixedHeight(sizeHint().height());
}

void FindDialog::findClicked()
{
    QString text = lineEdit->text();
    Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseSensitivity : Qt::CaseInsensitive;
    if(backwardCheckBox->isChecked()) {
        emit findPrevious(text, cs);
    } else {
        emit findNext(text, cs);
    }
}

void FindDialog::enableFindButton(const QString &text)
{
    findButton->setEnabled(!text.isEmpty());
}

Main.cpp

#include <QApplication>
#include "findDialog.h"

int main (int argc, char *argv[])
{
    QApplication app(argc, argv);
    FindDialog *dialog = new FindDialog();
    dialog->show();
    return app.exec();
}

The errors are shown below:

finddialog.cpp:25:2: error: ‘QHBoxLayout’ was not declared in this scope
  QHBoxLayout *topLeftLayout = new QHBoxLayout;
  ^
finddialog.cpp:25:15: error: ‘topLeftLayout’ was not declared in this scope
  QHBoxLayout *topLeftLayout = new QHBoxLayout;
               ^
finddialog.cpp:25:35: error: expected type-specifier before ‘QHBoxLayout’
  QHBoxLayout *topLeftLayout = new QHBoxLayout;
                                   ^
finddialog.cpp:25:35: error: expected ‘;’ before ‘QHBoxLayout’
finddialog.cpp:29:2: error: ‘QVBoxLayout’ was not declared in this scope
  QVBoxLayout *leftLayout = new QVBoxLayout;
  ^
finddialog.cpp:29:15: error: ‘leftLayout’ was not declared in this scope
  QVBoxLayout *leftLayout = new QVBoxLayout;
               ^
finddialog.cpp:29:32: error: expected type-specifier before ‘QVBoxLayout’
  QVBoxLayout *leftLayout = new QVBoxLayout;
                                ^
finddialog.cpp:29:32: error: expected ‘;’ before ‘QVBoxLayout’
finddialog.cpp:34:15: error: ‘rightLayout’ was not declared in this scope
  QVBoxLayout *rightLayout = new QVBoxLayout;
               ^
finddialog.cpp:34:33: error: expected type-specifier before ‘QVBoxLayout’
  QVBoxLayout *rightLayout = new QVBoxLayout;
                                 ^
finddialog.cpp:34:33: error: expected ‘;’ before ‘QVBoxLayout’
finddialog.cpp:39:15: error: ‘mainLayout’ was not declared in this scope
  QHBoxLayout *mainLayout = new QHBoxLayout;
               ^
finddialog.cpp:39:32: error: expected type-specifier before ‘QHBoxLayout’
  QHBoxLayout *mainLayout = new QHBoxLayout;
                                ^
finddialog.cpp:39:32: error: expected ‘;’ before ‘QHBoxLayout’
finddialog.cpp: In member function ‘void FindDialog::findClicked()’:
finddialog.cpp:50:25: error: invalid use of incomplete type ‘class QLineEdit’
  QString text = lineEdit->text();
                         ^
In file included from finddialog.cpp:3:0:
finddialog.h:8:7: error: forward declaration of ‘class QLineEdit’
 class QLineEdit;
       ^
finddialog.cpp:51:39: error: invalid use of incomplete type ‘class QCheckbox’
  Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseSensitivity
                                       ^
In file included from finddialog.cpp:3:0:
finddialog.h:6:7: error: forward declaration of ‘class QCheckbox’
 class QCheckbox;
       ^
finddialog.cpp:52:17: error: expected primary-expression before ‘:’ token
                 : Qt::CaseInsensitive;
                 ^
finddialog.cpp:53:21: error: invalid use of incomplete type ‘class QCheckbox’
  if(backwardCheckBox->isChecked()) {
                     ^
In file included from finddialog.cpp:3:0:
finddialog.h:6:7: error: forward declaration of ‘class QCheckbox’
 class QCheckbox;
       ^
finddialog.cpp: In member function ‘void FindDialog::enableFindButton(const QString&)’:
finddialog.cpp:62:12: error: invalid use of incomplete type ‘class QPushButton’
  findButton->setEnabled(!text.isEmpty());
            ^
In file included from /opt/QtSDK/Desktop/Qt/4.8.1/gcc/include/QtGui/QDialog:1:0,
                 from finddialog.h:4,
                 from finddialog.cpp:3:
/opt/QtSDK/Desktop/Qt/4.8.1/gcc/include/QtGui/qdialog.h:53:7: error: forward declaration of ‘class QPushButton’
 class QPushButton;

Upvotes: 1

Views: 3671

Answers (2)

michel grino
michel grino

Reputation: 31

I just added the #include instruction in place of "class" for QLabel, QLineEdit, QPushButton, QCheckBox and added #include <QHBoxLayout> and #include <QVBoxLayout>. It worked just fine.

The problem I think comes from the Qt version. I work with Qt 5 and more and I read a book for Qt 4.

Upvotes: 3

Joel
Joel

Reputation: 2035

I think is better to include only the headers that are you going to use. Plus I made a few corrections in your includes:

File: proyect.pro:

HEADERS += FindDialog.hpp
SOURCES +=  FindDialog.cpp Main.cpp 
QT += widgets

File: FindDialog.hpp

#ifndef FINDDIALOG_H
#define FINDDIALOG_H

#include <QApplication>
#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QCheckBox>
#include <QHBoxLayout>
#include <QVBoxLayout>

# .. rest of your code
#endif

File FindDialog.cpp:

#include "FindDialog.hpp"
# resto of code

File Main.cpp:

#include "FindDialog.hpp"
# .. rest of your code

Above compiles fine in my environment

Upvotes: 0

Related Questions