Как в QT отображать ...

Тема в разделе "WASM.GUI", создана пользователем Andrei, 25 июн 2018.

  1. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Есть динамически меняющийся бит мап, с помощью чего его можно отображать в QT ?
     
  2. superakira

    superakira Active Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    380
    Andrei, заводишь таймер и по таймеру обновляешь битмап. можешь в виджет засунуть QImage - в него суешь битмап, этот имадж обновляешь по таймеру.
     
  3. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Ок, попробую
     
  4. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Хотелось бы спросить у более знающих людей, а в чем это лучше (проще, быстрее ) сделать,
    Ну может питон, может еще что нибудь, .... может SFML
     
  5. superakira

    superakira Active Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    380
    Andrei, Эта задача 100% для кьюта. В чем проблема у тебя? Какая конкретно задача? Как часто битмап появляется и откуда он берется (сеть/фс)?
    Если графики рт нужны то они там уже есть.
     
  6. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    1. OS Linux
    2. Бит мап генерится прогой (FFTW) файл specdata.out и srcdata.out
    3. Вроде раз в секунду
    4. https://github.com/dj0abr/SDR-IQ-capture
    5. Прога консольная, и нужно прикрутить GUI
    6. Проблема в том что никогда ничего такого не делал, нужен пример как это делается ....
    Код (C++):
    1. void save_spectrum1s()
    2. {
    3. float real, imag, mag;
    4. unsigned int ival;
    5. #ifdef _LINUX_
    6. // do not disturb the capture process, so fork the file-save to a child process
    7. int pid = fork();
    8. if (pid == 0)
    9. #endif
    10. {
    11. FILE *fw = fopen("/tmp/specdata.out", "w");
    12. if (fw)
    13. {
    14. for (int i = 0; i < fftcnt; i++)
    15. {
    16. // calculate absolute value
    17. real = cpout48[i][0];
    18. imag = cpout48[i][1];
    19. mag = sqrt((real * real) + (imag * imag));
    20. // scaling not required since max possible value fits in int
    21. // the max possible value is 32768 * 24000 (input size * N)
    22. ival = (unsigned int)(mag);
    23. // save value, MSB first
    24. fprintf(fw, "%c%c%c%c", (ival >> 24) & 0xff, (ival >> 16) & 0xff, (ival >> 8) & 0xff, ival & 0xff);
    25. }
    26. fclose(fw);
    27. exit(0);
    28. }
    29. }
    30. }
    31.  
    Код (C++):
    1. void capture1s(short *samples)
    2. {
    3. int err;
    4. int rate = CAP_RATE;
    5. // capture a chunk of 1 second
    6. if ((err = snd_pcm_readi(capture_handle, samples, rate)) != rate) {
    7. printf("read from audio interface failed (%s)\n", snd_strerror(err));
    8. exit(1);
    9. }
    10. // calculate the mean value, peak value and save everything in a file srcdata.out
    11. // this file is used by the GUI to display a Spectrum and show the levels
    12. if (opmode == 'S')
    13. {
    14. for (int i = 0; i < (rate * 2); i++)
    15. meanlevel.add((float)samples[i]);
    16. // do not disturb the capture process, so fork the file-save to a child process
    17. int pid = fork();
    18. if (pid == 0)
    19. {
    20. FILE *fw = fopen("./tmp/srcdata.out", "w");
    21. if (fw)
    22. {
    23. // save mean value, MSB first
    24. short val = (short)(meanlevel.getval());
    25. fprintf(fw, "%c%c", (val >> 8) & 0xff, val & 0xff);
    26. // save peak value, MSB first
    27. val = (short)(meanlevel.getmaxval());
    28. fprintf(fw, "%c%c", (val >> 8) & 0xff, val & 0xff);
    29. // save samples (I channel only), MSB first
    30. for (int i = 0; i < (rate * 2); i += 2)
    31. {
    32. fprintf(fw, "%c%c", (samples[i] >> 8) & 0xff, samples[i] & 0xff);
    33. }
    34. fclose(fw);
    35. exit(0);
    36. }
    37. }
    38. }
     
  7. superakira

    superakira Active Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    380
    Andrei, у тебя много вариантов как сделать.
    1. Ты стартуешь программу в фоне. она дропает картинку, ты видишь что поменялась и обновляешь ее в виджете у геувого. кьют умеет мониторить папки на изменение и кидать сигнал.
    2. Ты интегрируешь код с гитхаба в гуевое приложение. Те ты получаешь массив со спектром и загоняешь его в виджет графиков. и у тебя в реальном времени будет он обновлятся, а не картинку раз в секунду.

    п1 - это как прототип можно, п2 - более взрослое решение, но тоже не сильно долго это делать.
     
  8. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Во про виджет графиков по подробнее, его самому делать ? Или он уже существует ?
     
  9. superakira

    superakira Active Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    380
  10. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Ну не без этого уж,... ну не напишу эт да, а может ? с чего то нужно начинать )))))
     
  11. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Сеньк гранд, за link
     
  12. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Ты прям как великий обломщик, никогда ты не будешь поднимать взглядом стакан ,.....
     
  13. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    А как без Qt это сделать ? ну динамически менять картинку ?
    Ну можь есть какая нибудь простенькая либа, для графики ....
     
  14. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
  15. superakira

    superakira Active Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    380
    Andrei, это задача для первокурсника. я хз что тебе не понятно. имея под жопой qt с кучей доков + гугл + стэковерфлоу.

    Есть данный->поститал ффт->получаи 2 массива (img and real)->перевел в частотную область (поимел 1 массив с 2)->загнал в массив для отрисовки графика.

    Технически надо развести по потокам - рассчет в 1, отрисовка в другом и гонять только массивы.

    Хз что тебе не ясно. Написать за тебя? =) Но тогда смысл в твоих изысканиях...