Як створити просту консольну програму Qt в C ++?


78

Я намагався створити просту консольну програму, щоб спробувати синтаксичний аналізатор Qt XML. Я розпочав проект у VS2008 і отримав такий шаблон:

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    return a.exec();
}

Оскільки мені не потрібна обробка подій, мені було цікаво, чи можу я зіткнутися з проблемами, якщо я нехтую створити QCoreApplication і запустити цикл подій. У документах зазначено, що це рекомендується у більшості випадків.

Однак заради цікавості мені цікаво, як я можу змусити виконати якесь загальне завдання в циклі подій, а потім припинити роботу програми. Мені не вдалося загуглити відповідний приклад.


Питання занадто розмите. Якщо у вас є конкретна проблема, опублікуйте код і опублікуйте будь-які помилки. Якщо ви шукаєте інструкції, Google - ваш найкращий друг.
— Джон Дайблінг

Вам потрібно викликати exec (), якщо ви хочете запустити цикл подій; здається, ви не хочете цього робити. Тим не менш, якщо ви все-таки захочете запустити цикл подій, ви можете змусити цикл подій вийти, викликавши qApp-> quit () (де qApp - глобальна змінна, яку Qt встановлює для вказівки на ваш об'єкт QApplication)
— Джеремі Friesner

що сказав Джеремі: НЕ ВИКЛИКАТИ ВИКОНАВЦЯ (). вам не потрібен цикл подій.
— ianmac45

2
Вибачте, якщо це занадто розмито, але я не уявляв, як його розширити. Проблема полягала в тому, що документи мене спонукали повірити, що цей шаблон, хоча і не є загальнообов’язковим, насправді є правильним способом робити щось. Тоді було одне запитання - чи це правда, чи я можу пропустити це, і на нього було задовільно відповідено. Інше питання було, по суті: як мені змусити речі запускатись у циклі подій, а потім виходити. Редагування для роздумів, можливо, це щось змінить.
— neuviemeporte

Відповіді:


107

Ось один простий спосіб структурувати додаток, якщо вам потрібен цикл подій.

// main.cpp
#include <QtCore>

class Task : public QObject
{
    Q_OBJECT
public:
    Task(QObject *parent = 0) : QObject(parent) {}

public slots:
    void run()
    {
        // Do processing here

        emit finished();
    }

signals:
    void finished();
};

#include "main.moc"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // Task parented to the application so that it
    // will be deleted by the application.
    Task *task = new Task(&a);

    // This will cause the application to exit when
    // the task signals finished.    
    QObject::connect(task, SIGNAL(finished()), &a, SLOT(quit()));

    // This will run the task from the application event loop.
    QTimer::singleShot(0, task, SLOT(run()));

    return a.exec();
}

4
@baysmith У qt5 це, QObject::connect(task, &Task::finished, &QCoreApplication::quit);здається, теж працює.
— Ерік Сьолунд

QCoreApplication::quit- слот:QTimer::singleShot(0, &a, SLOT(quit()));
— Answeror

3
чому ви включаєте main.moc?
— Йола,

Причина main.mocповинна бути включена описана тут: stackoverflow.com/questions/34928933 / ...
— тантуні

18

Не забудьте додати

CONFIG += console 

прапор у файлі qmake .pro.

В іншому - просто використання деяких класів Qt. Один із способів використання - це створення процесів міжплатформенних.


4

Вам взагалі не потрібно QCoreApplication, просто включіть свої Qt-об'єкти, як і інші об'єкти, наприклад:

#include <QtCore>

int main()
{
    QVector<int> a; // Qt object

    for (int i=0; i<10; i++)
    {
        a.append(i);
    }

    /* manipulate a here */

    return 0;
}

6
З документації: "Деякі класи Qt, такі як QString, можна використовувати без об'єкта QCoreApplication. Однак загалом ми рекомендуємо створити QCoreApplication або QApplication об'єкт у вашій функції main () якомога раніше.". Що робити, якщо я хочу бути обережним або, можливо, буду планувати використовувати цикл подій у майбутньому? Я припускаю, що мені слід створити якийсь клас типу Q_OBJECT і робити свою роботу всередині нього - як це повинно виглядати?
— neuviemeporte

2
На те, як це повинно виглядати, впливатиме те, що ви хочете зробити. Якщо зрештою ви хочете зробити щось, що використовує цикл подій, використовуйте цикл подій. Оскільки ви не зафіксували проблему, яку намагаєтесь вирішити, будь-які відповіді будуть загальнозмістовно дзенні. Це все одно, що запитати нас, як би виглядала ваша книга, якби ви писали книгу. Але ви не кажете нам, яку книгу ви хочете написати.
— Вросекранс

Для аналогії, у найзагальнішому випадку, книга має обкладинку та сторінки між ними. Я думаю, що baysmith зумів показати загальний вигляд таких обкладинок, тобто як запустити щось у циклі події end return.
— neuviemeporte

3

Мені вдалося створити просту консоль "привіт світ" за допомогою QT Creator

використано Creator 2.4.1 та QT 4.8.0 у Windows 7

два способи зробити це

Звичайний C ++

зробити наступне

  1. Файл - новий файл-проект
  2. під проектами виберіть: інший Проект
  3. виберіть "Простий проект C ++"
  4. введіть назву проекту 5. Націлювання виберіть Робочий стіл «поставте галочку»
  5. просто натисніть далі
  6. ви можете використовувати команди c ++ як звичайний c ++

або

Консоль QT

  1. Файл - новий файл-проект
  2. під проектами виберіть: інший Проект
  3. виберіть Консоль програми QT
  4. Виберіть цілі Робочий стіл "поставте галочку"
  5. просто натисніть далі
  6. додайте наступні рядки (всі C ++ включає, що вам потрібно)
  7. додати "#include 'iostream'"
  8. додати "за допомогою простору імен std;"
  9. після QCoreApplication a (int argc, cghar * argv []) 10 додайте змінні та ваш код програми ..

приклад: для консолі QT "привіт світ"

файл - новий файл проекту "назва проекту"

інші проекти - консольна програма QT

Вибір цілей "Робочий стіл"

управління проектами - далі

код:

    #include <QtCore/QCoreApplication>
    #include <iostream>
    using namespace std;
    int main(int argc, char *argv[])
    {
     QCoreApplication a(argc, argv);
     cout<<" hello world";
     return a.exec();
     }

ctrl -R для запуску

компілятори, що використовуються для MSVC 2010 (QT SDK) та minGW (QT SDK)

сподіваюся, це комусь допомагає

Оскільки я нещодавно почав використовувати QT, а також шукав інформацію та приклади в Www, щоб розпочати роботу з простими прикладами, які все ще шукають ...



1

Ви можете запустити подію в слоті quit () програми, навіть не підключаючись (). Таким чином, цикл подій робить принаймні один поворот і повинен обробляти події у вашій main () - логіці:

#include <QCoreApplication>
#include <QTimer>

int main(int argc, char *argv[])
{
    QCoreApplication app( argc, argv );

    // do your thing, once

    QTimer::singleShot( 0, &app, &QCoreApplication::quit );
    return app.exec();
}

Не забудьте помістити CONFIG += consoleу свій .pro-файл або встановити consoleApplication: trueу .qbs Project.CppApplication.


-1

Була та сама проблема. знайшов кілька відео на Youtube. Тож ось ще простіша пропозиція. Це весь необхідний код:

#include <QDebug>

int main(int argc, char *argv[])  
{
   qDebug() <<"Hello World"<< endl;
   return 0;
}

Наведений вище код походить від підручника Qt5: Створення простого консольного додатка за допомогою

Домінік Тібо

http://www.youtube.com/watch?v=1_aF6o6t-J4


3
Тут не використовується цикл подій Qt. Це оголений основний Unix ().
— Рауль Салінас-Монтеагудо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.