标签: qtquick2

用C++创建QML元素?

我有以下问题:

我将初始界面加载到QQuickView使用.qml文件中.然后我要添加QML类型等的Image或者Text使用C++的接口.

我知道我可以操纵C++中的现有元素,但是如何创建新类型并添加它们呢?

qt qml qt5 qtquick2

7
推荐指数
1
解决办法
8750
查看次数

处理QQuickItem上的鼠标事件

我创建了一个基本的QML应用程序,它使用QQuickView创建视图,并在其中有自定义的QQuickItems.我想通过重新实现mousepressevent(QEvent*)方法来处理一个这样的QQuickItem上的鼠标事件.但是,当我运行应用程序并单击QQuickItem时,不会调用 mousepressevent(QEvent*)方法.

QQuickItem的头文件如下所示:

#include <QQuickItem>
#include <QSGGeometry>
#include <QSGFlatColorMaterial>

class TriangularGeometry: public QQuickItem
{
         Q_OBJECT
         public:
              TriangularGeometry(QQuickItem* parent = 0);
              QSGNode* updatePaintNode(QSGNode*, UpdatePaintNodeData*);
              void mousePressEvent(QMouseEvent *event);

         private:
              QSGGeometry m_geometry;
              QSGFlatColorMaterial m_material;
              QColor m_color;
}; 
Run Code Online (Sandbox Code Playgroud)

注意:我正在使用scenegraph来渲染QuickItem.

这是cpp文件的片段:

void TriangularGeometry::mousePressEvent(QMouseEvent *event)
{
    m_color = Qt::black;
    update(); //changing an attribute of the qquickitem and updating the scenegraph
}
Run Code Online (Sandbox Code Playgroud)

我可以从应用程序处理鼠标事件,但根据我的要求,我需要通过重写方法mousePressEvent(QMouseEvent*event)来处理它.

qt mouseevent qtquick2

7
推荐指数
1
解决办法
4694
查看次数

如何在QML中添加和使用资源?

我想在一个简单的Qt项目中使用QtQuick Image对象,并在项目中包含图像.我已将图像添加到资源文件中.我使用调试来确保资源存在并作为"Resources/myfile.png"编译到应用程序中

但是,如果我声明一个QtQuick图像对象并将源设置为"Resource/myfile.png",则找不到图像.相反,我收到一条消息:

QML Image: Cannot open: file:///C:/Users/me/Documents/QtCreator/build-myapp-Desktop_Qt_5_1_1_MinGW_32bit-Debug/qml/myapp/Resources/dial_bg.png
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用C++方法来访问文件,也会出现同样的情况

source: ":/Resources/dial_bg.png"
Run Code Online (Sandbox Code Playgroud)

这在编译时遇到错误.

myfile.png尚未复制到该位置.myfile.png没有出现在项目文件中,尽管它已被添加到资源文件中.

我会很满意一个解决方案,要么将图像复制到Image想要拾取它的地方,要么让Image访问'编译版'版本.

qt image qml qtquick2

7
推荐指数
2
解决办法
2万
查看次数

如何在没有QQuickView的情况下获取QML应用程序的截图

我想抓住我的QML应用程序的屏幕.但我的根QML对象是ApplicationWindow,所以我不能QQuickView用来显示它.相反,我必须使用QQmlApplicationEngine.我知道如何使用QQuickView(QQuickWindow::grabWindow)获取屏幕截图,但不知道如何使用它QQmlApplicationEngine.

我的main档案:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    ApplicationData appData;
    QQmlApplicationEngine engine;
    engine.load(QUrl("qrc:///main.qml"));
    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

main.qml :

import QtQuick 2.1
import QtQuick.Controls 1.1
import QtQuick.Window 2.1


ApplicationWindow {
    id: mainWindow
    width: appData.screenWidth
    height: appData.screenHeight
    visible: true

    Rectangle {
        id: mainWindowBackground
        color: "red"
        anchors.fill: parent
    } 

    //...
}
Run Code Online (Sandbox Code Playgroud)

qt screenshot qml qtquick2 qtquickcontrols

7
推荐指数
1
解决办法
2680
查看次数

如何在ListView的项目之间设置自定义分隔符

有没有办法使用自定义委托作为ListView类似headerfooter属性的每两个连续项之间的分隔符?

qt qml qt5 qtquick2

7
推荐指数
1
解决办法
5165
查看次数

在ListView中使用QAbstractListModel

我是Qt的新手,所以请耐心等待.

我已成功设法从StringList和Object的QList填充ListView*

我现在正在努力的是使用在C++中定义的派生QAbstractListModel的类在QML中填充ListView.

这是我的CPP类的原型:

class MessageListEntryModel : public QAbstractListModel
{

Q_OBJECT
public:

enum eMLERoleTypes
{
    MLERT_MSG = Qt::UserRole+1,
    MLERT_COLOR
};

                                MessageListEntryModel(QObject* parent=0);
        virtual                 ~MessageListEntryModel();

        void                    AddEntry(QString aMessage, QColor aColor);

        // pure virtuals implementations
        QVariant                data(const QModelIndex &index, int role = Qt::DisplayRole) const;
        int                     rowCount(const QModelIndex &parent = QModelIndex()) const ;
        int                     columnCount(const QModelIndex &parent = QModelIndex()) const ;
        QModelIndex             index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
        QModelIndex             parent(const QModelIndex &child) const ;

        QHash<int,QByteArray>   roleNames();
private:
 QList<MessageEntry*> m_vpMessages; …
Run Code Online (Sandbox Code Playgroud)

qt listview qabstractlistmodel qt5 qtquick2

7
推荐指数
1
解决办法
1万
查看次数

具有居中内容的流程布局

当窗口宽度太小而无法显示行中的所有项目时,我有一行包含应该堆叠的项目,如下面的草图所示:

在此输入图像描述

Flow组件堆的项目,但他们不是中心,但在左侧或右侧对齐:

Flow {
    Item {}
    Item {}
    Item {}
    Item {}
    Item {}
}
Run Code Online (Sandbox Code Playgroud)

QML中是否有内置方式使流量居中?

qml qt5 qtquick2

7
推荐指数
1
解决办法
1810
查看次数

保护QML源代码免受抄袭

目标是提出一种保护您的QML代码免受抄袭的方法.这是一个问题,因为在这方面,QML的设计和实施方式似乎莫名其妙地不受保护.唯一受到保护的QML类型是完全用C++实现的类型.

  • Qt资源文件不支持任何程度的保护
  • 即使您压缩资源文件,从中提取数据对于经验适中的人来说仍然相当微不足道
  • 存储在文件系统上的QML文件几乎可以用于获取
  • 这同样适用于任何远程QML文件,除了增加对互联网连接的依赖之外,很容易嗅探网络访问并通过他们的网址获取QML文件
  • QML似乎没有提供任何公共API,以允许用户对QML类型解析进行足够的控制以保护其代码

总而言之,它几乎看起来Qt故意吝啬QML代码保护,一个明显的候选理由是迫使人们购买具有QML编译器的疯狂表达的商业许可证.

因此,如果没有任何保护QML源的库存方法,目前我想到的唯一解决方案是控制如何解决QML类型.有几种方法可以将类型注册到QML:

  • 注册应用程序可执行文件
  • 在插件中注册
  • 通过QML模块注册

但是,我需要的是手动解析QML类型,就像你可以创建一个QQuickImageProvider输入URL字符串并输出图像的自定义一样,我需要QML引擎来请求一个字符串,其类型为我的自定义组件提供程序,它输出一个就绪用于对象实例化组件.

如果使用任何自定义实例化机制,这将很容易,但我需要这些类型在常规QML源中可用.理想情况下,在查看可用的导入路径或甚至是内部注册的类型之前,这应该是用于解析类型的第一种机制.

或者,如果有一种方法可以完全用C++定义QML模块,没有任何外部QML文件,没有qmldir文件等等,那将同样有用.

作为最后的手段,从理想情况来说,我也不愿意在运行时注册QML(而不是C++)类型,这也很有用,但我更愿意完全控制解析过程.

QML插件没有这个技巧,因为它注册了C++类型,我想注册QML类型,即QQmlComponent从字符串源创建并相互引用.

c++ qt qml qtquick2 type-resolution

7
推荐指数
1
解决办法
1883
查看次数

在拖放项目期间滚动项目

按照这个Qt 教程,我编写了这个简单的代码。有一个水平线,上面ListView有一些简单的彩色矩形作为模型项目的代表。

import QtQuick 2.5
import QtQuick.Window 2.0
import QtQml.Models 2.2

Window {
    visible: true
    width: 300
    height: 120
    title: qsTr("Hello World")

    Rectangle {
        anchors.fill: parent;

        ListView{
            id: timeline
            anchors.fill: parent
            orientation: ListView.Horizontal
            model: visualModel
            delegate: timelineDelegate

            moveDisplaced: Transition {
                NumberAnimation{
                    properties: "x,y"
                    duration: 200
                }
            }

            DelegateModel {
                id: visualModel
                model: timelineModel
                delegate: timelineDelegate
            }

            Component {
                id: timelineDelegate


                MouseArea {
                    id: dragArea

                    width: 100; height: 100

                    property bool held: false

                    drag.target: held ? content …
Run Code Online (Sandbox Code Playgroud)

qt drag-and-drop drag qml qtquick2

7
推荐指数
1
解决办法
1789
查看次数

如何在 ColumnLayout 中居中元素

如何将元素居中ColumnLayout

这是我的qml代码:

ApplicationWindow {
    id: root
    visible: true
    width: 640
    height: 640
    title: qsTr("Your Booking")
    GridLayout{
        anchors.fill: parent
        columns: 2
        flow: GridLayout.TopToBottom
        Rectangle{
            id: appBar
            Layout.columnSpan: 2
            width: root.width
            height: root.height/10
            color: "red"
        }
        ColumnLayout{
            spacing:5
            id: columnData
            height: root.height - appBar.height
            width: root.width/2

            ComboBox{
                 anchors.horizontalCenter: parent.horizontalCenter
            }
            ComboBox{

            }
            ComboBox{
            }
            ComboBox{
            }
            ComboBox{
            }
        }
        ColumnLayout{

        }

    }
}
Run Code Online (Sandbox Code Playgroud)

我想在 ColumnLayout 中居中组合框。

在此处输入图片说明

qt qtquick2

7
推荐指数
1
解决办法
6596
查看次数