Andrei, заводишь таймер и по таймеру обновляешь битмап. можешь в виджет засунуть QImage - в него суешь битмап, этот имадж обновляешь по таймеру.
Хотелось бы спросить у более знающих людей, а в чем это лучше (проще, быстрее ) сделать, Ну может питон, может еще что нибудь, .... может SFML
Andrei, Эта задача 100% для кьюта. В чем проблема у тебя? Какая конкретно задача? Как часто битмап появляется и откуда он берется (сеть/фс)? Если графики рт нужны то они там уже есть.
1. OS Linux 2. Бит мап генерится прогой (FFTW) файл specdata.out и srcdata.out 3. Вроде раз в секунду 4. https://github.com/dj0abr/SDR-IQ-capture 5. Прога консольная, и нужно прикрутить GUI 6. Проблема в том что никогда ничего такого не делал, нужен пример как это делается .... Код (C++): void save_spectrum1s() { float real, imag, mag; unsigned int ival; #ifdef _LINUX_ // do not disturb the capture process, so fork the file-save to a child process int pid = fork(); if (pid == 0) #endif { FILE *fw = fopen("/tmp/specdata.out", "w"); if (fw) { for (int i = 0; i < fftcnt; i++) { // calculate absolute value real = cpout48[i][0]; imag = cpout48[i][1]; mag = sqrt((real * real) + (imag * imag)); // scaling not required since max possible value fits in int // the max possible value is 32768 * 24000 (input size * N) ival = (unsigned int)(mag); // save value, MSB first fprintf(fw, "%c%c%c%c", (ival >> 24) & 0xff, (ival >> 16) & 0xff, (ival >> 8) & 0xff, ival & 0xff); } fclose(fw); exit(0); } } } Код (C++): void capture1s(short *samples) { int err; int rate = CAP_RATE; // capture a chunk of 1 second if ((err = snd_pcm_readi(capture_handle, samples, rate)) != rate) { printf("read from audio interface failed (%s)\n", snd_strerror(err)); exit(1); } // calculate the mean value, peak value and save everything in a file srcdata.out // this file is used by the GUI to display a Spectrum and show the levels if (opmode == 'S') { for (int i = 0; i < (rate * 2); i++) meanlevel.add((float)samples[i]); // do not disturb the capture process, so fork the file-save to a child process int pid = fork(); if (pid == 0) { FILE *fw = fopen("./tmp/srcdata.out", "w"); if (fw) { // save mean value, MSB first short val = (short)(meanlevel.getval()); fprintf(fw, "%c%c", (val >> 8) & 0xff, val & 0xff); // save peak value, MSB first val = (short)(meanlevel.getmaxval()); fprintf(fw, "%c%c", (val >> 8) & 0xff, val & 0xff); // save samples (I channel only), MSB first for (int i = 0; i < (rate * 2); i += 2) { fprintf(fw, "%c%c", (samples[i] >> 8) & 0xff, samples[i] & 0xff); } fclose(fw); exit(0); } } }
Andrei, у тебя много вариантов как сделать. 1. Ты стартуешь программу в фоне. она дропает картинку, ты видишь что поменялась и обновляешь ее в виджете у геувого. кьют умеет мониторить папки на изменение и кидать сигнал. 2. Ты интегрируешь код с гитхаба в гуевое приложение. Те ты получаешь массив со спектром и загоняешь его в виджет графиков. и у тебя в реальном времени будет он обновлятся, а не картинку раз в секунду. п1 - это как прототип можно, п2 - более взрослое решение, но тоже не сильно долго это делать.
Andrei, ты не напишешь во-первых) во-вторых ты ппц ленивый, даже не загуглил. http://doc.qt.io/qt-5/qtcharts-audio-example.html лови)
А как без Qt это сделать ? ну динамически менять картинку ? Ну можь есть какая нибудь простенькая либа, для графики ....
Andrei, это задача для первокурсника. я хз что тебе не понятно. имея под жопой qt с кучей доков + гугл + стэковерфлоу. Есть данный->поститал ффт->получаи 2 массива (img and real)->перевел в частотную область (поимел 1 массив с 2)->загнал в массив для отрисовки графика. Технически надо развести по потокам - рассчет в 1, отрисовка в другом и гонять только массивы. Хз что тебе не ясно. Написать за тебя? =) Но тогда смысл в твоих изысканиях...