Russian Qt Forum
Август 21, 2017, 20:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1] 2 3 ... 84
1  Qt / Вопросы новичков / Re: QAudioBuffer : Июль 17, 2017, 13:22
Если нужны только данные о звуке для визуализации музыки, воспроизводимой QMediaPlayer, то для этого есть QAudioProbe. Примеров и обсуждений навалом, в том числе, в оригинальной документации на Qt. Правда не всё везде работает - вот тут есть табличка с перечнем функций, которые работают в разных ОС. Как видно, в Windows QAudioProbe не работает, если используется подсистема DirectShow.

Если нужен весь поток того, что воспроизводит QMediaPlayer, то я бы копал в сторону получения воспроизводимых данных в буфере через QIODevice *QMediaPlayer::mediaStream() и потом QByteArray QIODevice::read(qint64 maxSize). По идее там просто должны валить все сэмплы того, что воспроизводит QMediaPlayer. QAudioInput для этого не нужен - цифровой поток ведь целиком внутренний, QMediaPlayer его воспроизводит, значит можно получить поток от него, а не через вход. QAudioInput - это вообще ВВОД звука, то есть он совершенно сбоку от QMediaPlayer.

Но в случае если надо получить вообще всё, что воспроизводится устройством, то здесь есть проблема... Дело в том, что в разных ОС по-разному организованы воспроизведение и запись звука. В Windows есть такое устройство whatyouhear, это выход аудио-микшера. В принципе можно записывать с него, если использовать это устройство для ввода в QAudioInput. Но вообще-то это ещё зависит от возможностей аудио-оборудования - драйвер берёт выходной сигнал аудио-карты, если он доступен на конкретном железе, если у аудио-карты есть такой программный порт. Если нет, то ничего не получится. В Linux совсем другая звуковая система ALSA, в которой устройства называются иначе, и там не всегда получается скоммутировать внутренние сигналы, чтобы получить выход микшера. У меня на одном компьютере получилось, на другом нет - очевидно тоже зависит от оборудования. В Android, который вроде бы тоже Linux, вообще нет возможности поймать полный выходной сигнал микшера - это сделано, чтобы не нарушались авторские права, чтобы было невозможно записать воспроизводимую платную музыку. Как в MAC OS X и iOS я не знаю, но скорее всего тоже нет такой возможности.

В Android специально для визуализаций есть внутренний класс Visualizer, который выдаёт испорченный звук, но пригодный для визуализации (к сожалению, даже моно). Аналога его в Qt нет, пришлось обращаться к Java функциям через Native интерфейс. Это весьма не тривиально, но работает.

То есть, мультиплатформенное приложение, которое ловит и визуализирует весь воспроизводимый устройством звук, только на одном Qt не получится. Для каждой платформы придётся делать по-разному, с условной трансляцией.
2  Qt / Вопросы новичков / Re: QAudioBuffer : Июль 16, 2017, 13:25
На Питоне не делал, делал на С++, и не с помощью QAudioProbe, а честно через QAudioInput. Всё работает.

Но вот в документации на Qt для С++ написано буквально следующее:

Цитировать
QAudioBuffer::QAudioBuffer()

Create a new, empty, invalid buffer.

То есть,
Код:
buffer = QAudioBuffer()
недостаточно, буфер необходимо инициализировать, использовать один из двух других конструкторов, либо с буфером QByteArray, либо с заданием числа сэмплов. И соответственно задать требуемый формат аудио. Думаю, что для Питона правило то же самое.
3  Qt / Qt Embedded / Динамические разрешения Android 6.0 в Qt 5.9 : Июнь 06, 2017, 22:01
Пишут, что в Qt 5.9 есть поддержка динамических разрешений (permissions), которые появились в Android 6. Чё-то нигде не могу найти как это реализовано, как этим пользоваться. Они же необходимы, чтобы настройки сохранять, и для кучи других действий. Везде в сети нахожу только ссылки на баг трекер и упоминания о том, что публично решение доступно в релизе Qt 5.9. В самом релизе не получается найти. Кто-нибудь разбирался как этим пользоваться?
4  Qt / Qt Embedded / Re: Добавить Android API level 23 к установленному 15 : Июнь 05, 2017, 19:45
Да, проект на виджетах. У меня был развёрнут API 15, в проектах было target==minimum==15. И в готовых проектах так и должно остаться. В новых должно быть target==23, minimum==15. Установил через SDK Manager соответствующие модули для API 23, но пока ещё не начинал собирать. Не знаю - не будет ли проблем с компилятором (GCC 4.9), установленным NDK (r12b) и его отладчиком. Помню, что когда в первый раз устанавливал, вроде были какие-то несовместимости пакетов, не всё сразу заработало.
5  Qt / Qt Embedded / Добавить Android API level 23 к установленному 15 : Июнь 05, 2017, 13:56
Создаю приложения для Android в Linux 14. Приложения собираются с API level 15 всё хорошо. Мне необходимо это сохранить. Но для создания нового приложения требуется API level 23. То есть, мне нужно сохранить возможность сборки с API level 15, и получить возможность сборки с API level 23. Как я устанавливал и настраивал всю эту мутоту, я уже точно не помню. По идее, должно быть достаточно в Android SDK Manager установить один пакет. Запускаю этот менеджер, он сам предлагает сделать апдейт Android SDK Tools 25.1.7, Android SDK Platform-tools 24, Android Support Repository, Google Repository. Вот тут мне уже не понятно - действительно ли необходимо обновлять все эти пакеты? Не потеряю я при этом возможность сборки с API level 15? Кто-нибудь работает на одной машине с двумя API разных версий? Какие есть подводные камни?

Заодно - везде, в том числе и на фирменном сайте Google, советуют для установки какого-то одного пакета использовать командную утилиту sdkmanager. Но у меня её почему-то нет, не нашёл в каталогах где установлен Android SDK.
6  Qt / Дополнительные компоненты / Re: Библиотеку-клиент для работы с POP3/SMTP/IMAP для Qt ещё не сделали? : Май 26, 2017, 01:17
SmtpClient - это интересно. Но мне и получать хочется... По идее это должен быть единый комплект.
7  Qt / Дополнительные компоненты / Библиотеку-клиент для работы с POP3/SMTP/IMAP для Qt ещё не сделали? : Май 24, 2017, 22:27
Никто не встречал? Чтобы только загнать вызовами адрес почты, настройки соединения и дёрнуть "отправить". Не возиться с почтовым MIME, кодировками, атачами и прочим. А для приёма настроить подключение, интервал опроса и потом ловить в слоте сигнал с упакованным письмом. И конечно, чтобы это всё с Qt правильно и хорошо работало, то есть, само было сделано с его использованием.

А то очень хочется в совершенно стороннее для почты приложение встроить отправку и получение писем, для организации общения пользователей, но без выделенного для этого сервера. Но возиться с изобретением очередного почтового велосипеда не хочется.

8  Qt / Qt Embedded / Re: Эффекты боковых шторок в Android : Апрель 27, 2017, 02:12
Вообще вся мобилка по хорошему если пишется в Qt, то на QML, ставьте Qt 5.8 глядите примеры по Qt Quick Controls 2 и будет вам счастье.

Без QML никак? Воротит меня от него... По идее, всё что делается на QML, должно делаться и на C++, так как его объекты под крышкой с названием QML лежат.

В Qt Quick Controls 2 я нашёл эту штуку - Drawer Control. Ладно, посмотрим подробнее...
9  Qt / Qt Embedded / Re: Эффекты боковых шторок в Android : Апрель 27, 2017, 02:09
Вы о Navigation Drawer чтоли?
Как вариант. Но во-первых шторка может быть и справа, во-вторых у неё не обязательно функции навигации. Могут быть и какие-то данные, выбор из таблицы.
10  Qt / Qt Embedded / Эффекты боковых шторок в Android : Апрель 26, 2017, 01:21
В Андроиде принято делать приложения, у которых по свайпу слева или справа появляются дополнительные "шторки" приложений. Там могут быть разные меню, настройки и т.д. Ну ладно, свайп я как-нибудь сам поймаю. А все эти шторки на Qt как - самому руками двигать? Или может для этого средства есть? А может есть идеальные? - Назначить на свайп слева появление слева окна, в котором можно свои виджеты расположить, и чтобы это окно автоматом подстраивалось под размеры экрана. Есть вообще такое для Qt?
11  Qt / Qt Embedded / Re: (РЕШЕНО) Странный глюк в Android - баг в Qt или Android : Апрель 11, 2017, 20:44
Окончательное решение, которое работает, без использования Java кода, не шибко элегантное, но простое.
В приватных свойствах класса виджета, наследующего QFrame:
Код:
QRect geo;
Где-то в конструкторе или инициализации виджета, лишь бы пораньше:
Код:
geo = geometry();
В начале paintEvent() этого виджета пишем:
Код:
   if( geo != geometry() )
        setGeometry( geo );

Дальнейшее нужно, если геометрия виджета может меняться в процессе работы приложения. Надо не забывать при каждом таком изменении сохранять новую геометрию в geo = geometry();. Кроме этого, в классе виджета заводим слот:
Код:
void screenWasLocked(){ geo = geometry(); }
В объявлении класса главного окна приложения, которое наследует QMainWindow создаём сигнал:
Код:
   void screenIsLocked();
Ниже него слот:
Код:
void appStateChanged(Qt::ApplicationState state)
{
    if( state == Qt::ApplicationSuspended )
        emit screenIsLocked();
}
Где-нибудь в конструкторе этого класса:
Код:
   connect(QApplication::instance(), SIGNAL(applicationStateChanged(Qt::ApplicationState)), SLOT(appStateChanged(Qt::ApplicationState)));
И, наконец, в дизайнере соединяем сигнал screenIsLocked() главного окна со всеми слотами screenWasLocked() всех виджетов, которые расположены на форме. Всё.

Это работает. Каждый раз при перерисовке QFrame будет выполняться лишнее сравнение с вызовом geometry(), но это стоит недорого.
12  Qt / Qt Embedded / Re: (РЕШЕНО) Странный глюк в Android - баг в Qt или Android : Апрель 11, 2017, 19:13
Не, ну ваще... сделал топором - сохраняю геометрию при залочивании экрана, и вызываю восстановление при разлочивании. В дебаг выводе всё хорошо, восстановилось. Но потом по чьему-то желанию происходит ещё одна перерисовка, и бабах! Виджетов три штуки, в paintEvent перед рисованием у каждого выводится
Код:
       qDebug()<<"repaint"<<"frame"<<frameRect()<<"geometry"<<geometry();
и получаю вот такое:
Цитировать
D/AlpsGL17(24511): (null):0 ((null)): repaint frame QRect(0,0 307x21) geometry QRect(471,320 307x21)
D/AlpsGL17(24511): (null):0 ((null)): repaint frame QRect(0,0 83x30) geometry QRect(471,270 83x30)
D/AlpsGL17(24511): (null):0 ((null)): repaint frame QRect(0,0 307x20) geometry QRect(471,340 307x20)
D/AlpsGL17(21709): (null):0 ((null)): repaint frame QRect(0,0 307x21) geometry QRect(471,320 307x21)
D/AlpsGL17(21709): (null):0 ((null)): repaint frame QRect(0,0 83x30) geometry QRect(471,270 83x30)
D/AlpsGL17(21709): (null):0 ((null)): repaint frame QRect(0,0 307x20) geometry QRect(471,340 307x20)
D/AlpsGL17(21709): (null):0 ((null)): repaint frame QRect(0,0 1280x752) geometry QRect(471,320 1280x752)
D/AlpsGL17(21709): (null):0 ((null)): repaint frame QRect(0,0 1280x752) geometry QRect(471,270 1280x752)
D/AlpsGL17(21709): (null):0 ((null)): repaint frame QRect(0,0 1280x752) geometry QRect(471,340 1280x752)

То есть, сначала рисует виджеты правильного размера, а потом сразу испорченного. И это уже после того, как экран разблокирован. Но! Только если экран в положении портрет. В положении ландшафт при тех же действиях только один раз:

Цитировать
D/AlpsGL17(24511): (null):0 ((null)): repaint frame QRect(0,0 307x21) geometry QRect(471,320 307x21)
D/AlpsGL17(24511): (null):0 ((null)): repaint frame QRect(0,0 83x30) geometry QRect(471,270 83x30)
D/AlpsGL17(24511): (null):0 ((null)): repaint frame QRect(0,0 307x20) geometry QRect(471,340 307x20)

И разумеется всё нормально.

Отсюда единственный выход виден - сохранять размеры этих трёх виджетов при старте приложения, и использовать их для рисования в paintEvent(). Потому что где портится геометрия, выяснить уже становится совсем сложно. Правда тогда придётся отслеживать изменение размеров в дизайнере, поскольку там они вполне могут изменяться.
13  Qt / Qt Embedded / Re: (РЕШЕНО) Странный глюк в Android - баг в Qt или Android : Апрель 11, 2017, 17:19
Баг запостил? Улыбающийся

Да, конечно. QTBUG-60101.

Вот как его обойти - пока ещё не решил. Могу, конечно, повесить в Java коде обработчик события блокировки клавиатуры (для screen lock/unlock отдельного события в Android нет) и вызывать из него Native функцию, дальше из неё сигнал, и по нему в виджете сохранять и восстанавливать геометрию QFrame. Этот вариант понятен. Но может есть вариант какой-то более элегантный, чем топор... Думаю.

Сигнал QCoreApplication::applicationStateChanged(Qt::ApplicationActive) не хиляет - он посылается до фактической разблокировки, когда виджет ещё имеет нормальный размер.
14  Qt / Пользовательский интерфейс (GUI) / События или сигналы про screen lock/unlock : Апрель 11, 2017, 16:54
Поиском не нахожу, на память не помню чтобы встречалось в описаниях. Но может пропустил. Этого на самом деле в Qt нет? Недостаток, однако...
15  Qt / Qt Embedded / Re: Странный глюк в Android 6 : Апрель 11, 2017, 15:03
Опа, опа - есть баг в Qt! В paintEvent() виджета я использую вызов frameRect() чтобы получить прямоугольник для заливки фона. По неизвестной причине (очевидно дыра в Qt для Android или в самом Android) если включена блокировка устройства и экран повёрнут в портрет, то эта функция возвращает не прямоугольник самого виджета, а... прямоугольник экрана. Причём она возвращает также прямоугольник экрана и после того, как блокировка снимается, и экран переводится в ландшафт. Если блокировка не включена, или если экран блокируется в ландшафте - то всё работает нормально. Может быть, это дырка и не Qt, а самого Android, но она срабатывает в версиях Android 4.0.3 и 6.0.

Ну да, не просто frameRect() портится - а geometry(). Причём это происходит только с QFrame.

Страниц: [1] 2 3 ... 84
Страница сгенерирована за 0.061 секунд. Запросов: 23.