Qt错误:QHBoxLayout没有在此范围内声明? [英] Qt Error: QHBoxLayout was not declaredin this scope?

查看:4066
本文介绍了Qt错误:QHBoxLayout没有在此范围内声明?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图编译以下使用Qt 4但我得到错误。我研究了很多来源,但我没有能够解决这个问题。见下面的代码。这个程序是从Qt 4教科书。该代码根据它们工作。

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文件

HEADERS += \
    findDialog.h

SOURCES += \
    findDialog.cpp \
    main.cpp

QT += widgets \
      gui

FindDialog.h

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

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();
}

错误显示如下:

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;


推荐答案

包括指令以代替QLabel,QLineEdit,QPushButton,
QCheckBox的类并添加 #include code> #include< QVBoxLayout> 。它工作很好。

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.

我认为问题来自Qt版本。我使用Qt 5和更多,我读一本书为Qt 4。

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

这篇关于Qt错误:QHBoxLayout没有在此范围内声明?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆