Ответы пользователя по тегу Qt
  • Как создать QML тип?

    @wxmaper Автор вопроса
    Такс, вот с этим разобрался:
    Model {
        anode: Anode {
        }
    }


    Нужно было дополнительно объявить типы через макрос QML_DECLARE_TYPE:
    QML_DECLARE_TYPE(Model)
    QML_DECLARE_TYPE(Anode)


    Но с этим ошибка по прежнему сохраняется...
    Model {
        Anode {
        }
    }


    Похоже нужен еще какой-то магический макрос :)

    Upd.
    Очень хитрый Qt! Залез в QQuickItem и подглядел что там у него есть... А есть у него задействованный макрос Q_CLASSINFO.
    В общем проблема решилась добавлением макроса таким образом:
    class Model : public QObject
    {
        Q_OBJECT
    
        Q_PROPERTY(Anode* anode READ anode WRITE setAnode NOTIFY anodeChanged)
    
        Q_PROPERTY(QObject* item WRITE addItem)
        Q_CLASSINFO("DefaultProperty", "item")
    
    public:
        explicit Model(QObject *parent = Q_NULLPTR);
    
    public slots:
        void addItem(QObject* item);
    }


    При создании объекта Anode вызывается метод Model::addItem. А там уже можно объекту Anode установить в качестве родителя объект Model.
    Ответ написан
    Комментировать
  • Как рассчитать позицию отрисовки тайла на изометрической сетке?

    @wxmaper Автор вопроса
    В общем получилось вот что:
    property var mapObjects: [
            { "row": 4, "col": 2, "wsize": 1, "hsize": 1, "wpos": 0, "hpos": 0,
                "source": "qrc:/tiles/002-000-00.png", "width": 500, "height": 373 },
            { "row": 4, "col": 2, "wsize": 2, "hsize": 2, "wpos": 1, "hpos": 1,
                "source": "qrc:/tiles/001-001-00.png", "width": 2079, "height": 3249 }, // tree
            { "row": 4, "col": 3, "wsize": 2, "hsize": 2, "wpos": 1, "hpos": 1,
                "source": "qrc:/tiles/001-002-00.png", "width": 1100, "height": 823 }, // tree
            { "row": 4, "col": 2, "wsize": 1, "hsize": 1, "wpos": 1, "hpos": 1,
                "source": "qrc:/tiles/002-000-00.png", "width": 500, "height": 373 }, 
            { "row": 4, "col": 3, "wsize": 1, "hsize": 1, "wpos": 1, "hpos": 0,
                "source": "qrc:/tiles/002-000-00.png", "width": 500, "height": 373 },
            { "row": 4, "col": 3, "wsize": 1, "hsize": 1, "wpos": 1, "hpos": 1,
                "source": "qrc:/tiles/002-000-00.png", "width": 500, "height": 373 },
        ]
    
    function createMapObjects() {
        mapObjects.map(function(tileInfo) {
            // нормализация размера создаваемого тайла
            var tile_w = tileWidth * tileInfo.wsize / cellDivider
            var tile_h = tileWidth/tileInfo.width * tileInfo.height * tileInfo.hsize / cellDivider
    
            // левая верхняя координата описывающего клетку прямоугольника
            var tile_sx = (map.width/2 + tileInfo.col*tileWidth/2 - tileInfo.row*tileWidth/2 - tileWidth/2)
            var tile_sy = (tileInfo.row*tileHeight/2 + tileInfo.col*tileHeight/2) - tile_h
    
            // координата создаваемого тайла
            var tile_x = tile_sx + tileWidth/cellDivider * tileInfo.wsize/cellDivider
                    + (tileWidth/cellDivider * tileInfo.wsize/cellDivider * tileInfo.wpos) * (cellDivider - tileInfo.wsize)
                    - (tileHeight/cellDivider * tileInfo.hsize * tileInfo.hpos)
    
            var tile_y = tile_sy + tileHeight/cellDivider * tileInfo.hsize/cellDivider
                    + (tileHeight/cellDivider * tileInfo.hsize/cellDivider * tileInfo.hpos) * (cellDivider - tileInfo.hsize)
                    + (tileHeight/cellDivider * tileInfo.wsize/cellDivider * tileInfo.wpos) * (cellDivider - tileInfo.wsize)
        })
    }


    Формулы дикие и, как выяснилось, подходят только для cellDivider = 2 ;-(
    уверен, можно сделать проще и правильнее :D

    2cff51d94cac4f358074b1df04ea80ed.png
    Ответ написан
    Комментировать
  • Как правильно передать void в функцию (C++/Qt)?

    @wxmaper Автор вопроса
    Короче сделал так:

    bool call(QWidget *qo, QMetaMethod metaMethod, QGenericReturnArgument *returnArgument)
    {
        /* ... */
        return metaMethod.invoke(qo, *returnArgument);
    }
    
    void somefunction()
    {
        void *vlayout;
        QGenericReturnArgument returnArgument(metaMethod.typeName(), &vlayout);
    
        if( call(qo, metaMethod, &returnArgument) ) {
            QLayout *layout = reinterpret_cast<QLayout*>(vlayout); 
            /* ... */
        }
    }

    работает.
    Ответ написан
    Комментировать
  • Как правильно собрать приложение Qt с динамической библиотекой?

    @wxmaper Автор вопроса
    Разобрался. Оказывается все решается в два щелчка: в исходники библиотеки нужно было добавить __declspec(dllexport) перед расшаренными функциями/классами.
    Ответ написан
    Комментировать
  • Как организовать удаление скрытых компонентов в Qt QML?

    @wxmaper Автор вопроса
    Решение вопроса: www.cyberforum.ru/qt/thread1328440.html
    Ответ написан
    Комментировать
  • Как в QML отобразить список без скролла?

    @wxmaper Автор вопроса
    ListView {
        ...
        ListView {
            interactive: false
        ...
        }
    }
    Ответ написан
    Комментировать