Як створити просту консольну програму 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.