Неполный тип недопустим QApplication

#c #qt

#c #qt

Вопрос:

Я изучаю C с помощью Qt. Я установил Qt 5.15 и использую VS2019. У меня есть приведенный ниже код (в соответствии с примером в учебнике, над которым я работаю):

 #include <QtGui>

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    QTextStream cout(stdout);

    //declarations of variables
    int answer = 0;

    do{
        //local variables
        int factArg = 0;
        int fact(1);
        factArg = QInputDialog::getInt(0, "Factorial Calculator", "Factorial of:", 1);
        cout << "User entered: " << factArg << endl;
        int i = 2;
        while (i <= factArg) {
            fact = fact * i;
              i;
        }
        QString response = QString("The factorial of %1 is %2.n%3").arg(factArg).arg(fact).arg("Do you want to compute another factorial?");
        answer = QMessageBox::question(0, "Play again?", response, QMessageBox::Yes | QMessageBox::No);
    } while (answer == QMessageBox::Yes);

    return EXIT_SUCCESS;
}
 

Тем не менее, я получаю приведенную ниже ошибку при создании экземпляра QApplication as app :

Incomplete Type is not Allowed

Я также получаю приведенную ниже ошибку для QInputDialog QMessageBox классов and:

name followed by '::' must be a class or namespace name

Я не уверен, почему это происходит — предположительно, что-то с пространством имен, но я не уверен, какую область предоставить. Я искал в Интернете, но безрезультатно.

Обновить

Добавление приведенных ниже ссылок на заголовки выдает cannot open source file ошибку для каждого.

 #include <QApplication>
#include <QInputDialog>
#include <QMessageBox>
 

Я также добавил предложения из комментариев к моему коду, теперь ниже:

 #include <QtGui>
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    QTextStream cout(stdout);

    //declarations of variables
    int answer = 0;

    do{
        //local variables
        int factArg = 0;
        int fact(1);
        factArg = QInputDialog::getInt(0, "Factorial Calculator", "Factorial of:", 1);
        cout << "User entered: " << factArg << endl;
        int i = 2;
        while (i <= factArg) {
            fact = fact * i;
              i;
        }
        QString response = QString("The factorial of %1 is %2.n%3").arg(factArg).arg(fact).arg("Do you want to compute another factorial?");
        answer = QMessageBox::question(0, "Play again?", response, QMessageBox::Yes | QMessageBox::No);
    } while (answer == QMessageBox::Yes);

    return EXIT_SUCCESS;
}
 

Но я все еще получаю те же ошибки.

Комментарии:

1. Компилятор, вероятно, видит только прямое объявление для QApplication . Попробуйте добавить #include <QApplication> .

2. @G.M. это то, что я пробовал изначально, но когда я добавляю эту ссылку, я получаю следующую ошибку: cannot open source file

3. изменить #include <QtGui> на #include <QtWidgets>

4. @eyllanesc Я получаю то же самое cannot open source file QtWidgets

5. @Dean также добавляет #include <iostream> и using namespace std;

Ответ №1:

Вы должны включить некоторые заголовки qt в приложение … в этом смысл сообщения

вам просто нужно добавить это в свой код

 #include <QApplication>
#include <QInputDialog>
#include <QMessageBox>
 

Комментарии:

1. Я получаю cannot open source file для каждого из этих объявлений ..?

Ответ №2:

Правильными заголовками для включения являются следующие:

 #include <QtWidgets/QApplication>
#include <QtWidgets/QInputDialog>
#include <QtWidgets/QMessageBox>
 

После их объявления компилятор принимает код.

Ответ №3:

Я собираюсь вырезать и вставить рабочую программу для вас.

В Qt, похоже, есть куча прямых определений. Я могу сказать, что мне не хватает правильного включаемого файла, если я попытаюсь заставить IDE действительно помочь мне выбрать вызов метода. Короче говоря, вам в значительной степени нужно #включить каждый тип виджета или другой класс, который вы собираетесь использовать. Я не сталкивался ни с какими ярлыками.

 #include <QApplication>

#include "MainWindow.h"

using namespace std;

/**
 * Main entry point.
 */
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow mainWindow;
    mainWindow.show();

    return app.exec();
}