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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 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(), это прокатывает при компиляции, но во время работы толку от этого индекса нет.

Еще заметил, что когда крутится цикл, конструкция

Код:
this->index(i, 0)

все время возвращает одно и тоже значение, несмотря на то, что 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.

Почему так?
21  Qt / Общие вопросы / Re: Узнать системную кодировку : Сентябрь 23, 2018, 18:04
Вот эти две статьи должны помочь:

Как в Qt работать с русскими именами файлов и директорий в Windows

Как в Qt узнать системную кодировку локали под Windows
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?
24  Qt / Qt Quick / Re: Android. Сплеш-скрин «съезжает» вниз через секунду после появления : Август 25, 2018, 13:43
Попозже, занят сильно.
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

Страница сгенерирована за 0.065 секунд. Запросов: 23.