Просмотр сообщений
|
Страниц: 1 [2] 3 4 ... 50
|
16
|
Qt / Model-View (MV) / Re: Возможно ли добавление строк в корень QStandardItemModel с помощью insertRows()?
|
: Декабрь 06, 2018, 14:12
|
Нет, потому что у него "Note: Calling index() on the QStandardItem object retrieved from this function is not valid". То есть index() у этого элемента невалидный, и по сути, то же самое что вызов QModelIndex() (который дает невалидный индекс). То есть получить index, который бы указывал на корень дерева, через элемент invisibleRootItem() невозможно. Ещё там в справке есть "An example usage of QStandardItemModel to create a tree". В это примере как раз подход, который используется в первом конструкторе. И ни слова не говорится, надо ли уничтожать в деструкторе понаделанные через new элементы.
|
|
|
17
|
Qt / Model-View (MV) / Возможно ли добавление строк в корень QStandardItemModel с помощью insertRows()?
|
: Декабрь 06, 2018, 13:44
|
Написал я конструктор модели, унаследованный от QStandardItemModel. Модель подразумевается древовидная. В нем shortcutManager.availableSection - просто QStringList с названиями разделов «верхнего» уровня: ShortcutSettingsModel::ShortcutSettingsModel(QObject *parent) : QStandardItemModel(parent) { // Создание разделов foreach(QString sectionName, shortcutManager.availableSection) { QStandardItem *sectionItem=new QStandardItem(sectionName); this->appendRow(sectionItem); } } Конструктор работает, строки в виде появляются. А потом думаю: нет, эдак у меня память потечет, потому что если сделать clean() в деструкторе, то очистится модель, а удалятся ли из кучи вставленные в нее QStandardItem - неизвестно. Придется городить рекурсивную очистку элементов, ну его нафиг. Поэтому переписал конструктор вот так: ShortcutSettingsModel::ShortcutSettingsModel(QObject *parent) : QStandardItemModel(parent) { // Создание разделов int nSection=shortcutManager.availableSection.size(); // Количество разделов
this->insertRows(0, nSection, QModelIndex()); // Вставка строк для разделов
for(int i=0; i<nSection; ++i) { QModelIndex index=this->index(i, 0);
QString sectionName=shortcutManager.availableSection.at(i); this->setData(index, sectionName); // Установка значения строки } } Но с таким кодом строк дерева в виде не видно. Я подозреваю, что проблема в методе insertRows(). Третьим параметром он принимает индекс элемента, для которого создаются «подчиненные» элементы. Проблема в том, в концепции QStandardItemModel нет специального индекса для корня дерева. Есть только невалидный индекс, и предполагается, что ячейки первого уровня просто имеют невалидный индекс родителя. Тогда возникает вопрос: а как блин создать ячейки первого уровня, если insertRows() требует индекс корневого элемента, но у нас его нет? Я пробую указать невалидный индекс как QModelIndex(), это прокатывает при компиляции, но во время работы толку от этого индекса нет. Еще заметил, что когда крутится цикл, конструкция все время возвращает одно и тоже значение, несмотря на то, что i меняется. Получается, что метод insertRows() невозможно применить для корня дерева, а можно применять только для элементов, которые уже есть в дереве. А как добавлять эти самые первичные элементы?
|
|
|
18
|
Qt / Qt Quick / Re: Тупит QML на примитивном коде - что ему еще надо? (С видео)
|
: Декабрь 05, 2018, 13:18
|
xintrea Вохможно, дрова на видюху надо обновить. А что вкладка "Начало" в Среаторе, подвержена проблеме? Она вроде тоже на qml вся
Debian Stable 9 и Intel i915, какие там дрова на видюху. Это проблема DE, при сворачивании до обычного размера, DE видимо не посылает какой-то сигнал, и окно типа QML Window не знает что надо перерисовываться. "Начало" в креаторе может быть и на QML, но окно QML Window, если оно и есть, сделано "внутри" стандартного Qt-окна. А у стандартных Qt-окон в Linux уже давно все баги поотлавливали.
|
|
|
19
|
Qt / Qt Quick / Тупит QML на примитивном коде - что ему еще надо? (С видео)
|
: Декабрь 04, 2018, 16:25
|
Сделал вот такой минимальный пример: import QtQuick 2.6 import QtQuick.Window 2.2
Window { visible: true width: 500 height: 500
Rectangle { anchors.fill: parent color: "blue" }
Rectangle { x: 0 y: 0 width: 100 height: 100 color: "red" } }
Это просто окно с синим фоном и красным прямоугольником в левом верхнем углу. Казалось бы, что тут может глючить? А глюки начинаются, когда меняется размер окна. Скриншоты сделать не могу, потому что в момент создания скриншота, окна, похоже, перерисовываются, и скриншот получается с «правильным» содержимым. Поэтому выкладываю видео: https://youtu.be/0ewK6jrqWmsВидно, что если два раза нажать «Развернуть», то содержимое окна становится неправильным: синяя заливка начинается не сверху окна, а с каким-то вертикальным отступом. Красный квадрат тоже смещен вниз на этот же отступ. Если двигать окно, то содержимое окна остается неправильным, но в какой-то момент вдруг перерисовывается, и снова становится правильным. Вопрос: в чем проблема, и как сделать так, чтобы окно всегда отрисовывалось правильно?
|
|
|
20
|
Qt / Qt Quick / Почему-то не вычисляется выражение в QML (с картинками)
|
: Декабрь 03, 2018, 19:55
|
Делаю я тип MetallFramePlanarButton.qml для отрисовки кнопки. Делается на базе типа Item. Предполагается, что кнопка квадратная. В нем сделано свойство scaleFactor (используемое для масштабирования внутренних элементов): Item { id: root ...
property double scaleFactor: buttonFrame.implicitWidth===0 ? 0 : root.width/buttonFrame.implicitWidth
// Размер кнопки задается шириной. Кнопка квадратная height: root.width
onWidthChanged: { setButtonFrameSize(); }
onHeightChanged: { setButtonFrameSize(); }
// * Установка размера картинки рамки * function setButtonFrameSize() { // Напрямую устанавливать значения нельзя var w=buttonFrame.implicitWidth*root.scaleFactor; var h=buttonFrame.implicitHeight*root.scaleFactor;
buttonFrame.width=w; buttonFrame.height=h; }
...
// Металлическая рамка // Относительно нее считаются размеры и смещения всех остальных элементов в кнопке Image { id: buttonFrame
source: "qrc:/resource/pic/button/metallFramePlanarButton/buttonCase.png" fillMode: Image.PreserveAspectFit }
} Используется эта кнопка с указанием ширины: MetallFramePlanarButton { id: exitToMainMenuButton
iconSource1: "qrc:/resource/pic/mapTools/buttons/iconMenu.png"
width: root.buttonSize } Так вот, ставлю я брекпоинт в функцию setButtonFrameSize(), чтобы посмотреть как вычисляются w и h. И вижу, что они равны нулю: http://i.piccy.info/i9/2094984c903235facac02d77768cd2b3/1543847738/275438/1286422/qml_trouble_function.pngПочему же, например, w равно нулю? Потому что: buttonFrame.implicitWidth = 169 root.scaleFactor = 0 Умножение на 0 дает 0. Теперь вопрос, а почему root.scaleFactor нуливой? Дублирую выражение, которым это свойство вычисляется, чтобы оно вычислилось в отладчике (его видно справа вверху, нижняя строчка: buttonFrame.implicitWidth===0 ? 0 : root.width/buttonFrame.implicitWidth И это выражение дает значение 0.53. Это совсем не 0! http://i.piccy.info/i9/1bf478f285b85c332fa833252893bd8b/1543853567/207581/1286422/scr0055.jpgТо есть, если вычислить выражение в отладчике, оно дает ненулевое значение. То же самое выражение, присвоенное свойству scaleFactor, имеет значение 0. Почему так?
|
|
|
22
|
Qt / Qt Quick / Как показать карту OpenSeaMap через плагин "osm" в QML
|
: Август 31, 2018, 00:42
|
Имею Qt 5.10.1, Linux Debian 9 Stable. Хочу сделать очень простую вещь: показать карту с тайлового сервера OpenSeaMap через плагин "osm". Читаю документацию тут: https://doc-snapshots.qt.io/qt5-5.10/location-plugin-osm.htmlЧитаю поправку к документации тут: https://bugreports.qt.io/browse/QTBUG-55176Использую такой код: // Карта OSEAM Map { id: mapOseam gesture.enabled: true anchors.fill: parent center: QtPositioning.coordinate(59.9758,29.7686) zoomLevel: 15
// Если раскомментировать - будет сегфолт // supportedMapTypes: MapType.CustomMap
// Плагин OSM с картой OSEAM plugin: Plugin { name: "osm"
PluginParameter { name: "osm.mapping.custom.host" value: "http://tiles.openseamap.org/seamark/" }
PluginParameter { name: "osm.mapping.cache.directory" value: "./mapCache/oseam" }
PluginParameter { name:"osm.mapping.providersrepository.disable" value:true }
} } Перед каждым запуском директорию с кешем очищаю. Но все равно все время показывается карта OpenStreetMap, а не OpenSeaMap. Я уже игрался как мог, ставил osm.mapping.providersrepository.disable в false, писал вместо http://tiles.openseamap.org/seamark/ сервер http://t1.openseamap.org/seamark/, комментировал/раскомментировал supportedMapTypes, пробовал прописывать activeMapType, но ничего не меняется: все время отображается OpenStreetMap, несмотря на то что указан другой тайловый сервер. Вопрос: как таки заставить плагин "osm" обращаться к другому тайловому серверу?
|
|
|
23
|
Qt / Qt Quick / Какую структуру программы вы делаете при использовании QML?
|
: Август 25, 2018, 13:43
|
Я разрабатывал всего две более-менее крупных программы на QML. Оба раза использовал такой подход: C++ - главный код, QML - как вспомогательный, только для отображения интерфейса.
Это выражалось в том, что, например, C++ оповещал QML об измнении отображаемых в интерфейсе значений через сигналы. Не QML запрашивал изменения значений, не классы регистрировались с Q_INVOKABLE, чтоб значения в QML сами менялись, а именно C++ код за всем следил.
И вот думаю, что надо отходить от такой структуры. А новую до конца все никак придумать не могу.
В связи с чем вопрос: кто как строит свои проекты с использованием QML?
|
|
|
25
|
Qt / Qt Quick / Android. Сплеш-скрин «съезжает» вниз через секунду после появления
|
: Август 18, 2018, 22:52
|
Сделал я сплеш-скрин в Qt/QML-приложении с помощью правки AndroidManifest.xml. Как это делал написал в следующей статье: Как добавить сплеш-скрин в QML-приложение под AndroidПо сути, для сплеш-скрина у меня создается layer, и картинка выводится в него. Проблема в том, что через секунду после появления, картинка «съезжает» вниз на 8-10 мм. Причем размер области, закрашенной цветом фона, не меняется. Однако, по какой-то причине, видимо, меняется центр layer-а. Эта проблема возникает только при портретной ориентации. На альбомной ориентации этой проблемы нет. Никаких появлений/исчезновения дополнительных панелей, типа панели в тремя Android-кнопками, не наблюдается (три кнопки все время видны). Вот. Как можно исправить эту проблему?
|
|
|
26
|
Qt / Qt Quick / Кто как управляется с маштабируемыми (Scale) элементами в QML?
|
: Август 10, 2018, 16:57
|
У меня в приложении много экранных элементов, которые должны масштабироваться относительно ширины/высоты экрана или ширины/высоты поля, которое выделено под какой-нибудь функционал.
Проблема в том, что при применении свойства scale, или при применении трансформации Scale, меняется только «видимое отображение» элемента. А его width и height остаются прежними.
И поэтому невозможно привязывать смасштабированные элементы друг к другу или к краям родителя через anchors и задавать им margins. Так же невозможно из распихивать в различные Row, Grid и д. т. Ну, то есть, возможно, но все будет размещено относительно полных размеров элементов.
Поэтому приходится размещать смасштабированные элементы по-старинке, через координаты x/y, которые вычисляются по всяким заковыристым формулам.
Это уже надоело, и я хотел бы узнать, как народ решает эту проблему. Как позиционировать смасштабированные элементы с помощью стандартных средств в QML?
|
|
|
27
|
Qt / Qt Quick / Наличие и отсутствие двоеточия: поясните за синтаксис QML
|
: Август 07, 2018, 20:10
|
Прочитав документацию вот тут: http://doc.qt.io/qt-5/qml-coordinate.htmlНаписал такой код: Item { id: root
property double geoTransportLatitude: 0 property double geoTransportLongitude: 0
...
Location { id: location
coordinate { latitude: root.geoTransportLatitude longitude: root.geoTransportLongitude } }
Binding { target: map property: "center" value: location.coordinate when: location.coordinate.isValid } И он работает. А потом думаю: стоп, чего это он работает? В биндинге идет обращение к полю coordinate элемента location. А значение поля coordinate в элементе location не задано! Есть какой-то странный вложенный элемент с типом coordinate (почему-то с маленькой буквы), но он же не задает _значение_поля_ coordinate. Взял, и поставил двоеточие после coordinate в элементе location, вот так: coordinate: { latitude: root.geoTransportLatitude longitude: root.geoTransportLongitude } И получил ошибку: MapArea.qml:90:21: Unable to assign double to QGeoCoordinate Теперь сижу и думаю: что эта запись БЕЗ двоеточия означает? Почему при описании свойства coordinate двоеточие ставить не нужно? Каким волшебным образом вложенный элемент преобразуется в значение поля?
|
|
|
28
|
Qt / Общие вопросы / Re: Собрать Си-библиотеку mimeTeX с Qt-программой
|
: Июль 28, 2018, 17:38
|
Так как из C++ - кода инклюдится Си-заголовок mimetex.h, то в нем вылазит много ошибок а инклудить внутри extern "C" не помогает? Разобрались вот здесь: https://www.linux.org.ru/forum/development/14348119Но потом, оказалось, что mimetex использовать как библиотеку не получится, потому что там такой Си-код, который срабатывает только один раз (потому что программа консольная, берет данные из исходного файла, записывает в выходной файл, и потом завершается). И поэтому там не предусмотрен переинит всех глобальных переменных чтобы запустить код второй раз. А там куча глобальных переменных, около полусотни. Поэтому при втором запуске основной функции происходит сегфолт.
|
|
|
29
|
Qt / Общие вопросы / Как в subdirs-проекте выставить основной проект, который будет запускаться?
|
: Июль 28, 2018, 17:32
|
Имеется Qt 5.10.1 и QtCreator 4.5.1 Есть проект в формате subdirs. И мне необходимо заставить среду QtCreator после нажатия Ctrl+R (запуск) или F5 (отладка) запускать бинарник основного проекта app. Нигде не могу найти как это сделать. Сейчас запускается вторичный проект mimetex. Код subdirs-проекта: TEMPLATE = subdirs SUBDIRS = app mimetex
app.file = app/app.pro app.depends = mimetex
mimetex.file = thirdParty/mimetex/mimetex.pro
|
|
|
30
|
Qt / Общие вопросы / Собрать Си-библиотеку mimeTeX с Qt-программой
|
: Июль 15, 2018, 19:25
|
Имеется широко известный в узких кругах проект mimetex - минималистичный генератор картинок формул на основе языка разметки TeX. Его сайт: http://www.forkosh.com/mimetex.html (в настоящий момент опять лег) Зато последняя версия аккуратно сохранена у автора MyTetra: https://webhamster.ru/mytetrashare/index/mtb0/15315568717nedxk2nkxВ архиве mimetex.zip есть документация по компиляции. * * * Задача в том, чтобы собрать Qt-программу со статической библиотекой, полученной из mimetex (исходники mimetex оформлены как программа, а не как библиотека). Для того, чтобы получить статическую библиотеку mimetex, я сделал следующее: А. Заменил в mimetex.c все определения и вызовы функции main() на mimetexMain(). Б. В файл mimetex.h добавил: #ifdef Q_OS_WIN #define MY_EXPORT __declspec(dllexport) #else #define MY_EXPORT #endif MY_EXPORT int CreateGifFromEq ( char *expression, char *gifFileName ); По сути, вызывать из этой библиотеки мне нужно только одну функцию CreateGifFromEq(). Qt-проект у меня состоит из двух под-проектов: библиотека mimetex и собственно сама программа: TEMPLATE = subdirs SUBDIRS = mimetex app
app.file = app/app.pro app.depends = mimetex
mimetex.file = thirdParty/mimetex/mimetex.pro Библиотека mimetex компилится в файл mimetex.a. С ворнингами, но компилится. А при сборке подпроекта приложения возникает две проблемы: Так как из C++ - кода инклюдится Си-заголовок mimetex.h, то в нем вылазит много ошибок, типа: In file included from ../../programm/app/src/main.cpp:2:0: ../../programm/app/src/../../thirdParty/mimetex/mimetex.h:267:12: error: expected identifier before ‘;’ token int class; /* e.g., 3=relation, TexBook pg.154*/ ^ ../../programm/app/src/../../thirdParty/mimetex/mimetex.h:267:12: error: multiple types in one declaration ../../programm/app/src/../../thirdParty/mimetex/mimetex.h:267:12: error: declaration does not declare anything [-fpermissive] ../../programm/app/src/../../thirdParty/mimetex/mimetex.h:319:61: error: expected identifier before ‘;’ token STATIC struct {char *name; int family; int istext; int class;} ^ ../../programm/app/src/../../thirdParty/mimetex/mimetex.h:319:61: error: multiple types in one declaration ../../programm/app/src/../../thirdParty/mimetex/mimetex.h:319:61: error: declaration does not declare anything [-fpermissive] ../../programm/app/src/../../thirdParty/mimetex/mimetex.h:337:34: error: too many initializers for ‘<anonymous struct>’ { NULL, 0, 0, 0 } } ^ ../../programm/app/src/../../thirdParty/mimetex/mimetex.h:337:34: error: too many initializers for ‘<anonymous struct>’ Я обошел это так. В приложении есть дефайн APPLICATION_NAME. Весь код mimetex.h (за исключение экспорта функции CreateGifFromEq) я оборачиваю конструкцией: #ifndef APPLICATION_NAME ... #endif В результате, когда собирается подпроект библиотеки mimetex, этого дефайна в коде нет, и библиотека собирается. А когда mimetex.h подключается из приложения, в mimetex.h остаются только директивы экспорта функции CreateGifFromEq(). Но на этапе линковки приложения все равно эта функция не видна: build/main.o: In function `main': Makefile:246: recipe for target 'bin/programm' failed make[1]: Leaving directory '/media/wd_640_part_2/home64bit/xi/work/develop/cpp/ProgrammWithMimetex/build-build-Desktop_Qt_5_10_1_GCC_64bit-Debug/app' Makefile:70: recipe for target 'sub-app-app-pro-make_first' failed /media/wd_640_part_2/home64bit/xi/work/develop/cpp/ProgrammWithMimetex/build-build-Desktop_Qt_5_10_1_GCC_64bit-Debug/app/../../programm/app/src/main.cpp:12: undefined reference to `CreateGifFromEq(char*, char*)' collect2: error: ld returned 1 exit status make[1]: *** [bin/programm] Error 1 Вот. Мне нужно сделать две вещи. Минимум: заставить компилиться проект приложения и делать вызов фукции CreateGifFromEq() Максимум: настроить подпроект mimetex.pro так, чтобы не лезли варнинги. Если mimetex компилить прямой командой: gcc -DAA mimetex.c gifsave.c -lm -o mimetex то варнингов нет. Готовый минимальный пример: http://rgho.st/6YP2gjCHq
|
|
|
Страниц: 1 [2] 3 4 ... 50
|
|
|