0 / 0 / 0
Регистрация: 02.12.2010
Сообщений: 40
1

Консольное приложение с сигналами и слотами

20.01.2013, 15:49. Показов 8152. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день всем, прошу помочь. Задали задание - написать консольное приложение с сигналами и слотами. Никак не могу понять как это сделать, вот например простейший код и он не работает:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <QtCore/QCoreApplication>
#include <QObject>
 
class MyClass : public QObject
{
Q_OBJECT
public:
private:
public slots:
signals:
};
 
MyClass mc;
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    return a.exec();
}
Ругается на создание объекта класса MyClass. Если кто видел, ткните носом в рабочее консольное приложение с сигналами и слотами пожалуйста, очень нужно.

Вывод qmake:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
17:40:35: Выполняется сборка проекта untitled6...
17:40:35: Настройки не изменились, этап qmake пропускается.
17:40:36: Запускается: «C:\Qt\qtcreator-2.4.1\mingw\bin\mingw32-make.exe» 
c:\qt\4.8.0\bin\qmake.exe -spec ..\..\4.8.0\mkspecs\win32-g++ CONFIG+=declarative_debug -o Makefile ..\untitled6\untitled6.pro
C:/Qt/qtcreator-2.4.1/mingw/bin/mingw32-make.exe -f Makefile.Debug
mingw32-make.exe[1]: Entering directory `C:/Qt/qtcreator-2.4.1/untitled6-build-desktop-Qt_4_8_0__4_8_0_________'
g++ -Wl,-subsystem,console -mthreads -o debug\untitled6.exe debug/main.o  -L"c:\Qt\4.8.0\lib" -lQtGuid4 -lQtCored4 
debug/main.o: In function `~MyClass':
C:\Qt\qtcreator-2.4.1\untitled6-build-desktop-Qt_4_8_0__4_8_0_________/../untitled6/main.cpp:5: undefined reference to `vtable for MyClass'
debug/main.o: In function `MyClass':
C:\Qt\qtcreator-2.4.1\untitled6-build-desktop-Qt_4_8_0__4_8_0_________/../untitled6/main.cpp:5: undefined reference to `vtable for MyClass'
collect2: ld returned 1 exit status
mingw32-make.exe[1]: Leaving directory `C:/Qt/qtcreator-2.4.1/untitled6-build-desktop-Qt_4_8_0__4_8_0_________'
mingw32-make.exe[1]: *** [debug\untitled6.exe] Error 1
mingw32-make.exe: *** [debug] Error 2
17:40:39: Процесс «C:\Qt\qtcreator-2.4.1\mingw\bin\mingw32-make.exe» завершился с кодом 2.
Возникла ошибка при сборке проекта untitled6 (цель: Desktop)
Во время выполнения сборки на этапе «Сборка»
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.01.2013, 15:49
Ответы с готовыми решениями:

Путаница с сигналами и слотами
Всем привет! Ситуация следующая. Есть класс формы в программе клиенте: #include...

Намудрил с сигналами и слотами
Намудрил с сигналами и слотами и не могу понять в чём ошибка. Отражается шесть виджетов и при этом...

Обмениваться сигналами и слотами могут только класса наследники от QObject и с макроопределением Q_OBJECT?
? :) ?

QProccess и консольное приложение|
Добрый день! Создаю объект QProccess, передаю в него командную строчку с путем к консольному...

10
Автор FAQ
2732 / 1428 / 89
Регистрация: 08.09.2011
Сообщений: 3,746
Записей в блоге: 1
20.01.2013, 16:36 2
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef OBJECTS_H
#define OBJECTS_H
 
#include <QObject>
 
class Objects : public QObject
{
    Q_OBJECT
public:
    explicit Objects(QObject *parent = 0);
    
signals:
    
public slots:
    void get_sig();
};
 
#endif // OBJECTS_H
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
#include "objects.h"
#include <QDebug>
Objects::Objects(QObject *parent) :
    QObject(parent)
{
}
 
void Objects::get_sig()
{
    qDebug()<<"TEST";
}

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef TESTSTS_H
#define TESTSTS_H
 
#include <QObject>
 
class teststs : public QObject
{
    Q_OBJECT
public:
    explicit teststs(QObject *parent = 0);
    void sed();
signals:
    void tester();
public slots:
 
    
};
 
#endif // TESTSTS_H
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
#include "teststs.h"
 
teststs::teststs(QObject *parent) :    QObject(parent)
{
 
}
 
void teststs::sed()
{
    emit tester();;
}
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <QCoreApplication>
#include <QDebug>
#include <QObject>
#include "teststs.h"
#include "objects.h"
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    teststs td;
    Objects td_2;
    QObject::connect(&td, SIGNAL(tester()), &td_2, SLOT(get_sig()));
    td.sed();
    return a.exec();
}
2
0 / 0 / 0
Регистрация: 02.12.2010
Сообщений: 40
20.01.2013, 17:06  [ТС] 3
Чистый, Большое спасибо за код!
0
9 / 9 / 1
Регистрация: 19.01.2012
Сообщений: 62
06.10.2014, 16:25 4
А как в таком приложении организовать прослушивание сетевого сокета ?
Т.е. так чтобы приложение не завершалось сразу и можно было бы таймеры, по мере необходимости, запускать.
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
06.10.2014, 17:16 5
Enforcer, а оно и не завершится само до выполнение qApp->quit().
0
9 / 9 / 1
Регистрация: 19.01.2012
Сообщений: 62
07.10.2014, 11:32 6
Вы это проверяли ?
У меня есть консольное КуТэ приложение, состоящее из одного файла main.cpp

C++ (Qt)
1
2
3
4
5
6
int main(int argc, char **argv)
{
    QCoreApplication app(argc, argv);
        // Некий текст программы...
        return 0; 
}
Оно прекрасно завершалось само, но не использовало отдельно созданный класс/объект.
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
07.10.2014, 11:48 7
return a.exec(); а не return 0;
0
9 / 9 / 1
Регистрация: 19.01.2012
Сообщений: 62
07.10.2014, 11:59 8
Т.е. если написать return a.exec(); вместо return 0; , то приложение не выключится само ?
Или , что именно Вы хотели сказать ?
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
07.10.2014, 12:04 9
exec() запускает цикл событий и пока вы его сами не завершите программа будет работа.
0
5148 / 2761 / 464
Регистрация: 05.10.2013
Сообщений: 7,288
Записей в блоге: 147
09.10.2014, 23:14 10
Цитата Сообщение от Matrasa Посмотреть сообщение
Ругается на создание объекта класса MyClass. Если кто видел, ткните носом в рабочее консольное приложение с сигналами и слотами пожалуйста, очень нужно.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <string>
#include <iostream>
#include <QCoreApplication>
#include <QObject>
 
class A : public QObject
{
    Q_OBJECT
signals:
    void signalHello( std::string message );
 
public:
    void sayHello()
    {
        std::string message = "Hello!";
        emit signalHello( message );
    }
};
 
class B : public QObject
{
    Q_OBJECT
public slots:
    void slotHello( const std::string &message )
    {
        std::cout << std::endl;
        std::cout << message << std::endl;
        std::cout << std::endl;
    }
};
 
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
 
    A a;
    B b;
 
    QObject::connect( &a, SIGNAL( signalHello( std::string ) ),
                      &b, SLOT( slotHello( std::string ) ) );
 
    while( true ) {
        std::cout << "Choose an action:" << std::endl;
        std::cout << "1 - Say hello" << std::endl;
        std::cout << "2 - Exit" << std::endl;
        std::cout << "> ";
 
        int command;
        std::cin >> command;
        switch ( command ) {
            case 1:
                a.sayHello();
                break;
            case 2:
                exit( 0 );
                break;
            default:
                std::cout << "Unknown command" << std::endl;
                break;
        }
    }
 
    return app.exec();
}
 
#include "main.moc"
P.S. Если будет ругаться, то: Clean -> Run qmake -> Build
0
75 / 75 / 8
Регистрация: 24.09.2015
Сообщений: 342
17.12.2018, 10:38 11
8Observer8, что значит
C++ (Qt)
1
#include "main.moc"
?

Qt пишет что файл не найдет

На других сайтах есть примеры консольного приложения с включенным механизмом сигналов и слотов, но откомпелировать его не удается. В Qt Creater создаю консольное приложение и копирую в него код из примера:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 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();
}
Код такого типа работает:
C++ (Qt)
1
2
3
4
5
6
7
8
9
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    printf("Hello world!\n");
 
    QTimer::singleShot(0, &a, SLOT(quit()));
 
    return a.exec();
}
А пример с задачами не компелируется
0
17.12.2018, 10:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.12.2018, 10:38
Помогаю со студенческими работами здесь

Простейшее консольное Qt приложение
возникают ошибки при обьявлении QVector&lt;QString&gt; (имеет не полный тип и не может быть определен), а...

(без консольное) приложение
Кто нибудь в курсе, почему если отключить консоль у qt, то ее нельзя завершить не аварийно? А...

Qt Creator - Консольное приложение
В Creator'е написал консольное приложение, при запуске требует библиотеки Qt, хотя в коде я...

Переделать консольное приложение в графическое
Здравствуйте, кто-то может помочь как это консольное приложение засунуть в Qt GUI? Проблема...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru