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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1] 2 3 ... 85
1  Qt / Qt Embedded / Как в Qt-приложении для Android поймать onRequestPermissionsResult? : Ноябрь 23, 2017, 21:58
Нужно для Android 6 запрашивать разрешения у пользователя и получать его ответ. Запрашивать получается, но получать ответ - нет.

Код:
public class PlayControl extends QtActivity
{
.....
    public static boolean requestPermission()
    {
        boolean p = true;
        if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.M )
        {
            Activity a = QtNative.activity();
            Context c = a.getApplicationContext();
            if( c.checkSelfPermission(Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED )
            {
                ActivityCompat.requestPermissions(a, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                                    Manifest.permission.READ_EXTERNAL_STORAGE,
                                                    Manifest.permission.RECORD_AUDIO }, 1);
                p = false;
            }
        }
        return p;
    }

    public void onRequestPermissionsResult(int requestCode, String permissions[], int grantResults[])
    {
        NativeCall.permissionsGranted();
    }
}

Колбэк onRequestPermissionsResult(...) хронически не вызывается. Примеров для Qt не нашёл. Может кто видел как это сделать? Именно в Qt.
2  Qt / Qt Embedded / Не компилируется запрос привелегий в дебаг режиме для Android. : Ноябрь 16, 2017, 00:08
Надо собрать проект с отладчиком, но на строке в .java коде компилятор выдаёт ошибку "неизвестный символ":

Код:
QtNative.activity().requestPermissions(...);

Очевидно нет символа requestPermissions, поскольку если эту строку закомментировать, то всё компилируется, а в других местах есть вызовы QtNative.activity(). Без отладчика всё компилируется нормально. Я так понимаю, это наверно защита от получения привилегий под отладчиком. Но как же быть, если без запрошеных привилегий моя программа вообще работать не может, соответственно отладить её невозможно? Где-то у меня что-то идёт не так при обработке аудио, мне надо найти где. В начале я инициализирую аудио - а без привилегии доступа к аудио на этой инициализации всё и заканчивается падением. То есть, без привилегий я не могу никак добраться до места с ошибкой. А со включенным отладчиком не могу их получить. Дурдом...  Злой
3  Qt / Общие вопросы / Откуда взялся m3u? : Ноябрь 12, 2017, 18:27
Мне нужно в дереве QFileSystemModel отобразить только музыкальные файлы.

Код:
    GoodFileSystemModel* fsm = new GoodFileSystemModel(this);
    fsm->setFilter(QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Files );
    fsm->setNameFilters( QStringList() << "*.mp3" << "*.flac" <<"*.ogg" << "*.wav" << "*.aac" << "*.3gp" );
.....

GoodFileSystemModel - это QFileSystemModel с некоторыми изменениями из-за косяков в оригинале. Все изменения касаются только drag-n-drop.
Всё вроде работает как надо, показывает только музыкальные файлы. Но когда лазаю по каталогам с музыкой, вдруг обнаруживаю в дереве файл... m3u. И какого блин хрена? Я его не заказывал!
4  Qt / Общие вопросы / Re: Ещё бажина... : Октябрь 31, 2017, 17:08
В общем лечится это самостоятельной чисткой записей в QSettings.

Код:
void MainWindow::saveList( QStringList list )
{
    QSettings settings(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)+
                       SETTINGSFORMAT, QSettings::IniFormat);
    int size;
    settings.remove( LISTNAME )                                         // added
    settings.beginWriteArray(LISTNAME, size = list.size());
    for( int i = 0; i < size; i++ )
    {
        settings.setArrayIndex( i );
        settings.setValue( ITEMNAME, list.at( i ) );
    }
    settings.endArray();
    settings.sync()
}

И хрена с два где-либо описано, что заполнение массивов в настройках их не очищает. По идее, очистка должна быть внутри beginWriteArray(), возможно по третьему (сейчас отсутствующему) параметру bool clean=true.
5  Qt / Общие вопросы / Ещё бажина... : Октябрь 31, 2017, 16:29
Понадобилось в INI файл сохранять массивы строк. У QSettings есть поддержка - beginWriteArray/beginReadArray/setArrayIndex/endArray. Использование простое. Как написано в доках Qt, так и сделал:

Запись:
Код:
void MainWindow::saveList( QStringList list )
{
    QSettings settings(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)+
                       SETTINGSFORMAT, QSettings::IniFormat);
    int size;
    settings.beginWriteArray(LISTNAME, size = list.size());
    for( int i = 0; i < size; i++ )
    {
        settings.setArrayIndex( i );
        settings.setValue( ITEMNAME, list.at( i ) );
    }
    settings.endArray();
    settings.sync()
}

Чтение:
Код:
QStringList MainWindow::restoreList()
{
    QSettings settings(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)+
                       SETTINGSFORMAT, QSettings::IniFormat);
    QStringList list;
    int size = settings.beginReadArray(LISTNAME);
    for( int i = 0; i < size; i++ )
    {
        settings.setArrayIndex( i );
        list << settings.value(ITEMNAME).toString();
    }
    settings.endArray();
    return list;
}

Запускаю, сохраняю список из 10 строк. Смотрю в INI файл - сохранился, 10 строк, в конце перменная size=10. Хорошо. Запускаю снова, читаю список, отображаю - есть 10 строк. Хорошо. Удаляю из списка 5 строк вперемежку, не подряд. Сохраняю снова, читаю... БУМ! В INI файле по-прежнему 10 строк. Первые 5 - те, которые я оставил, и соответственно сохранил. Следом за ними хвост из 5 строк от предыдущих 10, которые сохранял первый раз. И потом переменная size=5. Запускаю снова, читаю - получаю конечно же 5 строк. Отображаю - да, всё верно, первые 5. То есть, у меня QStringList.size() == 5. Сохраняю снова этот QStringList, смотрю INI файл - !@!@#$#... там 10 строк, первые 5 правильные потом хвост из лишних 5.

Что это значит? - Что если вы сохраните 1 раз 4235432 элементов массива в INI файле, а потом будете всё время сохранять и использовать только первые 2 элемента, то QSettings будет всё равно постоянно таскать туда-сюда и хранить на носителе ненужные 4235430 записей...  Злой

Руки отрывать надо за такое проектирование.

Баг репорт создал.
6  Qt / Вопросы новичков / Re: Qt Creator и Xiaomi Redmi 4X : Октябрь 24, 2017, 00:56
Откуда взялась связь между сборкой APK и выбором устройства? APK собирается и при отключенных устройствах, а выбор появляется при установке уже собранного APK.

Очевидно проблема при установке. Очевидно на устройстве надо дополнительно разрешить установку программ из неизвестных источников. Это стандартная настройка Android. Вполне могут быть и собственные заморочки Xiaomi. Но это уже надо на его форумах выяснять, здесь вряд ли кто ответит.
7  Qt / Мультимедиа / Re: Так какой всё-таки mediaStatus() должен быть? : Октябрь 12, 2017, 17:36
Похоже наоборот надо - ловить сигнал mediaStatusChanged(QMediaPlayer::MediaStatus) и в нём проверять состояние плеера. Этот сигнал при окончании трека выдаётся после stateChanged(QMediaPlayer::State). Если медиа статус EndOfMedia и состояние плеера StoppedState, значит трек закончился. В других случаях комбинации сигналов другие. Хрена с два где-нибудь это описано.
8  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? И самое главное - как это отличить от случая, когда воспроизведение закончилось принудительно, а не по концу трека?
Кто-нибудь разбирался?
9  Qt / Qt Embedded / Декорирование QSplitter в Android : Октябрь 10, 2017, 23:20
Че-то практически никакие настройки не работают. Получилось только стайлшитом заменить картинку на хэндлере и изменять толщину линий рамки. Цвет рамки не меняется, цвет фона не меняется. Всё? Только наследованием и перезагрузкой paintEvent()? Какие подводные камни? Кто-нибудь делал?
10  Qt / Пользовательский интерфейс (GUI) / Re: QListView drag-n-drop блин... : Октябрь 09, 2017, 19:07
В общем, если кто-то будет то же самое делать - работающий код есть вот здесь. То есть, надо сделать такой же класс, как там DragDropListModel, и его привязать к QListView в качестве модели. Единственное что нужно, чтобы айтемы именно переносились, а не копировались в списке - надо убрать Qt::CopyAction из supportedDropActions(). Если переноска айтемов только внутри списка, то можно убрать flags() - штатный QStringListItem::flags() и так возвращает эти флаги установленными.
11  Qt / Пользовательский интерфейс (GUI) / Re: QListView drag-n-drop блин... : Октябрь 09, 2017, 17:28
Это просто какая-то дырка от бублика... Унаследовал QStringListItem, переопределил flags(index), в котором взял родительский QStringListItem::flags(index) и сбросил в нём Qt::ItemIsDropEnabled. В результате строки драгаются, но перестали вообще дропаться. Даже между другими строками. То есть, изменилась функциональность не только строк, но списка, как целого. Какой болван это всё напроектировал? Непонимающий
12  Qt / Пользовательский интерфейс (GUI) / Re: QListView drag-n-drop блин... : Октябрь 08, 2017, 17:41
Да мне как бы надо то всего-навсего, чтобы в списке простые строки нормально переносились. Переупорядочивать его. Удивляет, что такая в общем совершенно стандартная ерунда вызывает целую возню с переопределением классов, перегрузкой методов... Начинает напоминать продукцию одной софто-мусорной компании, которая десятилетия выпускала г...но, предоставляя разработчикам возможность из него что-то делать.
13  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(). В общем - напутали тут с этими моделями капитально. Всё это выглядит аляповато и не доработано. Хотя уже существует несколько лет. Может быть - диверсия...
14  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);

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

Что тут ещё в документации не описано?
15  Qt / Пользовательский интерфейс (GUI) / Re: Глюк с virtual event() у MainWindow в Android : Октябрь 02, 2017, 18:51
ЫЫЫЫ!!!!.... Установил приложение на смартфон с Android 6 - глюка нет. Всё работает как полагается. Глюк есть на планшете с CyanogenMod 10.1 ака Android 4.1.1.  Злой
 
Страниц: [1] 2 3 ... 85
Страница сгенерирована за 0.06 секунд. Запросов: 23.