Консольное приложение qt

Рейтинг: -1Ответов: 1Опубликовано: 17.04.2023

Требуется создать консольное приложение, работающее в режиме диалога с пользователем, используя библиотеку qt. В библиотеке qt, применяются циклы обработки событий и использовать блокирующее ожидание ввода данных со стандартного потока ввода не очень хорошо, как и периодический опрос. Хотелось бы обрабатывать именно событие ввода строки с командой. Подскажите, пожалуйста, как это реализовать средствами библиотеки qt?

Привожу ссылку на проект, который реализует требуемую функциональность, но вместе с qt использует стандартную библиотеку c++.

https://gist.github.com/gjorquera/2576569

Ответы

▲ 1

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

class ConsoleListener : public QObject
{
    Q_OBJECT
public:
    explicit ConsoleListener(QObject *parent = nullptr)
    {
        QObject::connect(this, &ConsoleListener::finishedGetLine,
                         this, &ConsoleListener::on_finishedGetLine,
                         Qt::QueuedConnection);
        m_notifier = new QWinEventNotifier(GetStdHandle(STD_INPUT_HANDLE));
        m_notifier->moveToThread(&m_thread);
        QObject::connect(&m_thread, &QThread::finished, m_notifier, &QObject::deleteLater);
        QObject::connect(m_notifier, &QWinEventNotifier::activated, [this] (Qt::HANDLE hEvent){
            Q_UNUSED(hEvent)
            std::string line;
            std::getline(std::cin, line);
            QString strLine = QString::fromStdString(line);
            Q_EMIT this->finishedGetLine(strLine);
        });
        m_thread.start();
    }
    ~ConsoleListener()
    {
        m_thread.quit();
        m_thread.wait();
    }
signals:
    void newLine(const QString &strNewLine);
    void finishedGetLine(const QString strNewLine);

private:
    QWinEventNotifier *m_notifier;
    QThread m_thread;

private slots:
    void on_finishedGetLine(const QString &strNewLine)
    {
        Q_EMIT newLine(strNewLine);
    }
};