Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Читать клавиатуру read'ом в Qt 4.5  (Прочитано 1589 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Белый пони

  • Автор темы
  • Любитель
  • *
  • Сообщений: 63
    • Просмотр профиля
Читать клавиатуру read'ом в Qt 4.5
« : 25 Ноября 2009, 23:37:28 »
Есть программа, которая в консольном режиме считывает байты приходящие на com-порт() и выводить printf'ом на экран, при нажатии ESC программа завершается. Всё работает как надо.

Попытался сделать аналогичную штуку в Qt 4.5  (просто убрал принтфы и заменил на "ui->myLcd->display(int( R[0] ));", fp - file descriptor последовательного порта). Всё интересное в цикле while :

void myWid::on_myButton_clicked()
{
int i = 0;
char R[5] = {0};

struct termios tp1;
struct termios tp2;

tcgetattr( 0, &tp1);

tp2 = tp1;

  tp2.c_iflag&=~ICRNL;
  tp2.c_lflag&=~ICANON;
  tp2.c_lflag&=~ECHO;
  tp2.c_cc[VMIN ]=1;
  tp2.c_cc[VTIME]=0;
  tp2.c_cc[VINTR]=0xFF;
  tp2.c_cc[VSUSP]=0xFF;
  tp2.c_cc[VQUIT]=0xFF;

tcsetattr( 0, TCSANOW, &tp2);

fd_set set0, set;
FD_ZERO( &set);
FD_SET( fp, &set);
FD_SET(  0, &set);
set0 = set;

while(1)
        {
        if ( select( fp+1, &set, NULL, NULL, NULL ) > 0)
                {
                if( FD_ISSET( fp, &set))
                        {
                        i = read( fp, R, 1);
                        ui->myLcd->display(int( R[0] ));
                        //break;
                        }
                if( FD_ISSET( 0, &set) )
                        {
                        i = read( 0, R, 1);
                        if( R[0] == 27){ break;}
                        }
                }

        set = set0;
        }

tcflush( fp, TCIOFLUSH);
tcsetattr( 0, TCSANOW, &tp1);
}

Байты с ком-порта успешно принимаются и отображаются в QLCDNumber, а с клавиатуры ничего не принимается с том числе и ESC :(
Можно ли вообще читать клавиатуру read'ом в Qt 4.5 ? Что я делаю не так? :(

Ну и проблема номер два: Байты то считываются, но из них всех на LCDNumber отображается только последний, после выхода из цикла.
Как сделать так, чтобы показания QLCDNumber менялась сразу при получении байта, до завершения цикла?   Пытался добавлять "ui->myLcd->update();", не получилось :(

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
Re: Читать клавиатуру read'ом в Qt 4.5
« Ответ #1 : 26 Ноября 2009, 01:10:18 »
В цикле попробуйте вставить
 qApp->processEvents();
для обработки сообщений в очереди
Извините, я все еще учусь

Оффлайн Белый пони

  • Автор темы
  • Любитель
  • *
  • Сообщений: 63
    • Просмотр профиля
Re: Читать клавиатуру read'ом в Qt 4.5
« Ответ #2 : 26 Ноября 2009, 02:52:27 »
В цикле попробуйте вставить
 qApp->processEvents();
для обработки сообщений в очереди
Спасибо! LCD заработал как надо :)

 

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