Консольное приложение qt
Требуется создать консольное приложение, работающее в режиме диалога с пользователем, используя библиотеку 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);
}
};