Russian Qt Forum
Ноябрь 27, 2024, 00:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Консольное приложение  (Прочитано 23530 раз)
mcrads
Гость
« Ответ #15 : Март 02, 2010, 22:17 »

Ну собственно вот... естественно сигнал нового соединения у TCP сервера не проходит =((( не пойму как быть... помогите пожалуйста! чую без exec не обойтись... но как его впихнуть? в консольном приложении я так понял нельзя определить keyPressEvent =((( - в этом тоже крупная проблема... Помогите пожалуйста!

PS Меня еще расстраивает что в доках нет примера по консолькам =((
« Последнее редактирование: Март 02, 2010, 22:25 от Sickfar » Записан
BRE
Гость
« Ответ #16 : Март 02, 2010, 22:33 »

Ну собственно вот... естественно сигнал нового соединения у TCP сервера не проходит =((( не пойму как быть... помогите пожалуйста! чую без exec не обойтись... но как его впихнуть? в консольном приложении я так понял нельзя определить keyPressEvent =((( - в этом тоже крупная проблема... Помогите пожалуйста!
Так что программа должна делать?
Например, если это какой-то сервер, то можно создать объект и запустить цикл обработки событий.
Этот объект, будет слушать порт, обслуживать подключения, принимать/отправлять данные. Если придет команда EXIT, то он вызовет quit и приложение завершиться.

Код
C++ (Qt)
int main(int argc, char *argv[])
{
QCoreApplication app( argc, argv );
 
VFServer server;
QObject::connect( &server, SIGNAL( finished() ), &app, SLOT( quit() ) ); // Когда объект server пошлет сигнал finished, завершить eventloop
 
return app.exec();
}
 

Ты подробней напиши...
Записан
mcrads
Гость
« Ответ #17 : Март 02, 2010, 22:38 »

Ну это собственно сервак (клиентская часть пока не реализована...). он должен принимать клиентов и обслуживать их, а так же читать команды из консоли... так вот получается такая ерунда, что если не пускать exec - события не крутятся, это очевидно. запустить exec - значит писать обработчик событий. тогда как написать обработчик событий для ввода команд, если QKeyEvent лежит в модуле QtGui который в консольке отключен?
Записан
BRE
Гость
« Ответ #18 : Март 02, 2010, 22:49 »

он должен принимать клиентов и обслуживать их, а так же читать команды из консоли...
Ну так открывай stdio, подключай сигнал readyRead, и читай то что ввел пользователь в консоли:
Код
C++ (Qt)
QFile file;
file.open( stdio, QIODevice::ReadOnly );
connect( &file, SIGNAL( readyRead() ), SLOT( readUserCommand() );
 

Причем здесь QtGui? Причем здесь QKeyEvent?
Записан
mcrads
Гость
« Ответ #19 : Март 02, 2010, 23:07 »

на stdio ругается что не объявлено... на stdin - никакой реакции совершенно =(((

Дело в том что при включенном exec консоль вообще никак не реагирует на клаву. ввод как заблокирован. все что тыкаю - на экране не отображается и значит до системы не доходит... =(

Гуи здесь ни при чем, это я так, посетовал... я наверное вообще затупил... но блин, от этого решения зависит моя работа, а я с консолями еще не работал =(
« Последнее редактирование: Март 02, 2010, 23:13 от Sickfar » Записан
BRE
Гость
« Ответ #20 : Март 02, 2010, 23:15 »

Дело в том что при включенном exec консоль вообще никак не реагирует на клаву. ввод как заблокирован. все что тыкаю - на экране не отображается и значит до системы не доходит... =(
Венда?
Записан
mcrads
Гость
« Ответ #21 : Март 02, 2010, 23:17 »

она самая. под юнихом нормально будет?
Записан
BRE
Гость
« Ответ #22 : Март 02, 2010, 23:22 »

под юнихом нормально будет?
Нормально.
Насчет консоли в венде, подожди может кто знающий ответит. Там скорее всего свои заморочки...

UP: Кстати, если нужен такой интерактивный сервер, почему не использовать GUI. Можно сделать красивое окошко, в котором будет выводиться вся важная информация (количество подключенных клиентов, трафик, логи, ...), а так же будет строка, в которой можно вводить команды.
« Последнее редактирование: Март 02, 2010, 23:26 от BRE » Записан
mcrads
Гость
« Ответ #23 : Март 02, 2010, 23:24 »

все-таки stdio или stdin? в файле открывать? на  stdio ругается..
Записан
BRE
Гость
« Ответ #24 : Март 02, 2010, 23:27 »

все-таки stdio или stdin? в файле открывать? на  stdio ругается..
Конечно stdin, stdio это опечатка.  Улыбающийся
Записан
mcrads
Гость
« Ответ #25 : Март 02, 2010, 23:43 »

Код:
<Сие конструктор>
    file.open(stdin, QIODevice::ReadOnly);
    connect(&file, SIGNAL(readyRead()), this, SLOT(getCommand()));
<>
void VFServer::getCommand()
{
    QTextStream stre(&file);
    QString serverCommand;
    serverCommand = stre.readLine();
    QString command = serverCommand.toUpper();
    if (command == "EXIT")
    {
        emit finished();
        return;
    }
    runCommand(command);
}

скомпилил под маком - символы вводить можно, но увы все равно не работает ((( ррр!
Записан
mcrads
Гость
« Ответ #26 : Март 02, 2010, 23:50 »

UP: Кстати, если нужен такой интерактивный сервер, почему не использовать GUI. Можно сделать красивое окошко, в котором будет выводиться вся важная информация (количество подключенных клиентов, трафик, логи, ...), а так же будет строка, в которой можно вводить команды.


Задание такое - консоль. с гуем то все понятно... =(
Записан
BRE
Гость
« Ответ #27 : Март 03, 2010, 07:09 »

Код
C++ (Qt)
#include <QCoreApplication>
#include <QFile>
#include <QSocketNotifier>
#include <QDebug>
 
class StdinReader : public QObject
{
       Q_OBJECT
public:
       StdinReader();
 
public slots:
       void    readCommand();
 
private:
       QFile                   m_stdin;
       QSocketNotifier *m_notifier;
};
 
StdinReader::StdinReader()
{
       if( !m_stdin.open( stdin, QIODevice::ReadOnly ) )
       {
               qDebug() << "Error attach stdin";
               return;
       }
 
       m_notifier = new QSocketNotifier( m_stdin.handle(), QSocketNotifier::Read, this );
       connect( m_notifier, SIGNAL( activated( int ) ), SLOT( readCommand() ) );
}
 
void StdinReader::readCommand()
{
       QByteArray str = m_stdin.readLine();
       qDebug() << "Data:" << str;
 
}
 
int main( int argc, char *argv[] )
{
       QCoreApplication app( argc, argv );
 
       StdinReader reader;
 
       return app.exec();
}
 
#include "main.moc"
 
Записан
mcrads
Гость
« Ответ #28 : Март 03, 2010, 09:19 »

Спасибо! разобрался!!! отличный простенький пример! только жаль в винде все равно не работает =(
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.157 секунд. Запросов: 21.