QT控制台 - 按Enter退出

时间:2016-06-17 11:08:33

标签: c++ qt stdin

只是一个简单的问题。我正在开发一个QT控制台应用程序。现在,我想运行它直到用户按任意键(或者,如果更容易,直到按下回车键)。

应用程序有一个正在运行的事件队列(或更好的两个,一个用于“main”,另一个用于数据解析器)。

以下是代码相关部分的模拟:

的main.cpp

#include <QCoreApplication>
#include <QTimer>
#include "mainprogram.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QCoreApplication::setApplicationVersion("1.0");

    MainProgram mainProg(&a);
    QTimer::singleShot(0, &mainProg, SLOT(executeMain()));

    return a.exec();
}

mainprogram.h

#ifndef MAINPROGRAM_H
#define MAINPROGRAM_H

#include <QObject>
#include <QThread>
#include "datasourceparser.h"

class MainProgram : public QObject
{
    Q_OBJECT
public:
    explicit MainProgram(QObject *parent = 0);
    ~MainProgram();

public slots:
    void executeMain();
    void terminateProgram(int resultCode);

private:
    DataSourceParser *dataParser;
    QThread dataParserThread;
};

#endif // MAINPROGRAM_H

mainprogram.cpp

#include "mainprogram.h"
#include <QCoreApplication>

MainProgram::MainProgram(QObject *parent) : QObject(parent)
{

}

MainProgram::~MainProgram() {
    dataParserThread.quit();
    dataParserThread.wait();
}

void MainProgram::executeMain()
{
    dataParser = new DataSourceParser();
    dataParser->moveToThread(&dataParserThread);

    QObject::connect(&dataParserThread, SIGNAL(started()), dataParser, SLOT(execute()));
    QObject::connect(&dataParserThread, SIGNAL(finished()), dataParser, SLOT(deleteLater()));

    dataParserThread.start();

}

void MainProgram::terminateProgram(int resultCode)
{
    QCoreApplication::exit(resultCode);
}

现在,DataSourceParser完成所有细节。如果某些内容失败,它会使MainProgram::terminateProgram插槽正常退出,一切正常。

现在,我需要在用户按下某个键时调用该插槽的内容(或者只是输入,如果更容易)。

此解决方案应该是跨平台的(或至少是Windows和Linux x86 / x64)

而且,最重要的是,它不应该阻塞主线程事件队列(因此​​executeMain()函数内的readline是不可行的。)

谢谢

编辑:

作为Karsten Koop,我尝试添加here找到的QSocketNotifier实现:我复制了头文件和源文件内容(只是将#pragma once替换为通常的#ifndef CONSOLEREADER_H等。然后,在致电dataParser->moveToThread(&dataParserThread);之前,我添加了

ConsoleReader *cr = new ConsoleReader(this);
QSignalMapper *signalMapper = new QSignalMapper(this);
QObject::connect(cr, SIGNAL(textReceived(QString)), signalMapper, SLOT(map()));
signalMapper->setMapping(cr, 1);
this->connect(signalMapper, SIGNAL(mapped(int)), SLOT(terminateProgram(int)));

但是永远不会调用文本槽..

0 个答案:

没有答案