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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1] 2 3 ... 85
1  Qt / Мультимедиа / Re: Так какой всё-таки mediaStatus() должен быть? : Октябрь 12, 2017, 17:36
Похоже наоборот надо - ловить сигнал mediaStatusChanged(QMediaPlayer::MediaStatus) и в нём проверять состояние плеера. Этот сигнал при окончании трека выдаётся после stateChanged(QMediaPlayer::State). Если медиа статус EndOfMedia и состояние плеера StoppedState, значит трек закончился. В других случаях комбинации сигналов другие. Хрена с два где-нибудь это описано.
2  Qt / Мультимедиа / Так какой всё-таки mediaStatus() должен быть? : Октябрь 12, 2017, 16:46
Проигрываю аудио-файл с помощью QMediaPlayer. Нужно знать, когда оно закончило играть. Ловлю stateChanged(QMediaPlayer::State state). Смотрю состояние плеера и статус медиа.

Код:
qDebug()<<"state changed"<<state<<player->mediaStatus();

В документации Qt про статус медиа написано:

Цитировать
QMediaPlayer::BufferedMedia   6   The player has fully buffered the current media. The player is in the PlayingState or PausedState.
QMediaPlayer::EndOfMedia   7   Playback has reached the end of the current media. The player is in the StoppedState.

То есть, когда трек доиграл, я поймаю StoppedState и EndOfMedia? Ага, щаз... когда трек доиграл, получаю вот это:

Цитировать
state changed QMediaPlayer::StoppedState QMediaPlayer::BufferedMedia

Какого?... Почему не EndOfMedia? И самое главное - как это отличить от случая, когда воспроизведение закончилось принудительно, а не по концу трека?
Кто-нибудь разбирался?
3  Qt / Qt Embedded / Декорирование QSplitter в Android : Октябрь 10, 2017, 23:20
Че-то практически никакие настройки не работают. Получилось только стайлшитом заменить картинку на хэндлере и изменять толщину линий рамки. Цвет рамки не меняется, цвет фона не меняется. Всё? Только наследованием и перезагрузкой paintEvent()? Какие подводные камни? Кто-нибудь делал?
4  Qt / Пользовательский интерфейс (GUI) / Re: QListView drag-n-drop блин... : Октябрь 09, 2017, 19:07
В общем, если кто-то будет то же самое делать - работающий код есть вот здесь. То есть, надо сделать такой же класс, как там DragDropListModel, и его привязать к QListView в качестве модели. Единственное что нужно, чтобы айтемы именно переносились, а не копировались в списке - надо убрать Qt::CopyAction из supportedDropActions(). Если переноска айтемов только внутри списка, то можно убрать flags() - штатный QStringListItem::flags() и так возвращает эти флаги установленными.
5  Qt / Пользовательский интерфейс (GUI) / Re: QListView drag-n-drop блин... : Октябрь 09, 2017, 17:28
Это просто какая-то дырка от бублика... Унаследовал QStringListItem, переопределил flags(index), в котором взял родительский QStringListItem::flags(index) и сбросил в нём Qt::ItemIsDropEnabled. В результате строки драгаются, но перестали вообще дропаться. Даже между другими строками. То есть, изменилась функциональность не только строк, но списка, как целого. Какой болван это всё напроектировал? Непонимающий
6  Qt / Пользовательский интерфейс (GUI) / Re: QListView drag-n-drop блин... : Октябрь 08, 2017, 17:41
Да мне как бы надо то всего-навсего, чтобы в списке простые строки нормально переносились. Переупорядочивать его. Удивляет, что такая в общем совершенно стандартная ерунда вызывает целую возню с переопределением классов, перегрузкой методов... Начинает напоминать продукцию одной софто-мусорной компании, которая десятилетия выпускала г...но, предоставляя разработчикам возможность из него что-то делать.
7  Qt / Пользовательский интерфейс (GUI) / Re: QListView drag-n-drop блин... : Октябрь 08, 2017, 13:37
может надо setDragDropOverwriteMode(true) ?

Неа.

Цитировать
If its value is true, the selected data will overwrite the existing item data when dropped, while moving the data will clear the item. If its value is false, the selected data will be inserted as a new item when the data is dropped.

Но на самом деле, там всё гораздо хуже. Свойство "заменять" задаётся не только этим флажком, который похоже игнорируется, оно задаётся флажком в модели, которая цепляется к виду. У модели QStringListModel оно зашито глухо в класс. Его метод flags() возвращает флажок, который разрешает замену в строке при дропе на неё. Но по какой-то бездарной глупости нет метода, которым можно было бы менять свойства объекта этого класса. То есть, нет метода QStringListModel::setFlags(...). Единственный способ изменить флаги - наследовать QStringListModel и перегрузить flags(). Вроде бы есть другой способ - использовать не QListView, а QListWidget - у него избыточная функциональность, поэтому я его не рассматривал. В нём вроде бы можно вызывать setFlags() но почему-то не для всего класса, а для каждого элемента списка отдельно. Причём именно элемента списка, а не строки в QStringListModel. То есть, надо после каждого добавления строки в связанную со списком модель вытаскивать item этой строки из QListWidget, и для него вызывать setFlags(). В общем - напутали тут с этими моделями капитально. Всё это выглядит аляповато и не доработано. Хотя уже существует несколько лет. Может быть - диверсия...
8  Qt / Пользовательский интерфейс (GUI) / QListView drag-n-drop блин... : Октябрь 05, 2017, 20:23
Никогда не пользовался, по описанию всё выглядело просто, функционал не новый, вроде должно всё работать. Нужно просто перемещать строки в списке. Сделал как везде описано:

Код:
// lv - указатель на QListView
    lv->setMovement(QListView::Free);
    lv->setSelectionMode(QAbstractItemView::SingleSelection);
    lv->setDragEnabled(true);
    lv->viewport()->setAcceptDrops(true);
    lv->setDropIndicatorShown(true);
    lv->setDragDropMode(QAbstractItemView::InternalMove);
    lv->setDragDropOverwriteMode(false);

И хрена там. Строки не перемещаются, а копируются, при этом заменяют те, на которые сброшены, а не только вставляются между ними.

Что тут ещё в документации не описано?
9  Qt / Пользовательский интерфейс (GUI) / Re: Глюк с virtual event() у MainWindow в Android : Октябрь 02, 2017, 18:51
ЫЫЫЫ!!!!.... Установил приложение на смартфон с Android 6 - глюка нет. Всё работает как полагается. Глюк есть на планшете с CyanogenMod 10.1 ака Android 4.1.1.  Злой
 
10  Qt / Пользовательский интерфейс (GUI) / Re: Глюк с virtual event() у MainWindow в Android : Октябрь 02, 2017, 18:11
Долго не искал, для примера.
В qeffects.cpp есть QAlphaWidget, который устнавливает фильтр событий от самого qApp и обрабатывает двойной клик. И уверен таких классов относящихся к QGraphicsXXX еще масса.

А так дело ваше, не они - так не они.

В проблемных местах либо QLabel, лежащий на QGraphicsProxyWidget, либо производный от QWidget мой класс, также лежащий на QGraphicsProxyWidget. А прокси в свою очередь на QGraphicsScene и соответственно QGraphicsView. Всё.

Что самое странное - первый раз, то есть после запуска приложения, дабл-тап нормально пропускается. Второй раз уже нет.
11  Qt / Пользовательский интерфейс (GUI) / Re: Глюк с virtual event() у MainWindow в Android : Октябрь 02, 2017, 17:53
Вы писали, что MainWindow сложный виджет, возможно сообщения перехватывают его дочерние виджеты.

Те, которые перехыватывают - те перехватывают (кнопки, слайдеры), через них вообще тапы не проходят. Проблема с тапами туда, где нет перехватывающих виджетов. Там есть только виджеты, которые рисуют, у них нет перегруженных event(). И под ними QGraphicsView со сценой. Но во втором окне, которое правильно работает, тоже есть QGraphicsView со сценой. То есть, проблема не в них.

И потом - если бы перехватывали, то перехватывали бы каждый двойной тап, а не через один.
12  Qt / Пользовательский интерфейс (GUI) / Re: Глюк с virtual event() у MainWindow в Android : Октябрь 02, 2017, 17:29
Я смотрел-бы в первую очередь все установленные eventFilters.
Код:
bool MainWindow::event(QEvent *e)
{
    if( e->type()!=QEvent::UpdateRequest) qDebug()<<e->type();
    if( e->type() == QEvent::MouseButtonDblClick )
    {
............
    }
    if( e->type() == QEvent::HoverMove )
    {
............
    }
    return e->type() == QEvent::Gesture ? gesture( static_cast<QGestureEvent*>( e ) )
                                        : QWidget::event( e );
}
Больше ничего нет. Есть только перехваты жестов в конструкторе
Код:
    grabGesture(Qt::PinchGesture);
    grabGesture(Qt::TapAndHoldGesture);
    grabGesture(Qt::TapGesture);
Всё.
13  Qt / Пользовательский интерфейс (GUI) / Глюк с virtual event() у MainWindow в Android : Октябрь 02, 2017, 16:58
До сих пор с таким чудом не сталкивался. Обработчик event() в MainWindow в приложении для Android хронически пропускает через один DoubleClick. То есть, в нём есть

Код:
if( e->type() == QEvent::MouseButtonDblClick ) ...

Так вот оно true... на каждые 2 подряд двойных тапа на экран. Можно даже смело делать 4 тапа быстро подряд, чтобы гарантированно сработало. Сделал вывод в консоль - чего там в type() на самом деле, и получаю на первый двойной тап - только MouseButtonPress. Если через любой промежуток времени ещё раз сделать двойной тап, то прилетает MouseButtonDblClick.

НО! При этом я открываю ещё одно окно, тоже наследующее от MainWindow, и в нём тоже ловлю event() также точно - а там всё правильно работает.

Первое главное окно довольно сложное, на нём много всего. Пока не знаю, куда копать. Может кто уже сталкивался? Очевидно существенно, что это всё в Android.
14  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 не получится. Для каждой платформы придётся делать по-разному, с условной трансляцией.
15  Qt / Вопросы новичков / Re: QAudioBuffer : Июль 16, 2017, 13:25
На Питоне не делал, делал на С++, и не с помощью QAudioProbe, а честно через QAudioInput. Всё работает.

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

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

Create a new, empty, invalid buffer.

То есть,
Код:
buffer = QAudioBuffer()
недостаточно, буфер необходимо инициализировать, использовать один из двух других конструкторов, либо с буфером QByteArray, либо с заданием числа сэмплов. И соответственно задать требуемый формат аудио. Думаю, что для Питона правило то же самое.
Страниц: [1] 2 3 ... 85
Страница сгенерирована за 0.062 секунд. Запросов: 23.