标签: qt-quick

如何防止模糊的QtGraphicalEffects被切断?

带有截止阴影的qml窗口

我正在尝试使用带有QtGraphicalEffects的QtQuick 2为我的项目添加效果,但我不太明白如何调整真正模糊的效果来看起来正确.

在这种情况下,投影的尺寸很小,并且在完全消失之前会在边缘处被剪裁.我怎样才能让它很好地融入而不会被切断?

这是窗口的代码:

import QtQuick 2.0
import QtGraphicalEffects 1.0

Item {
    width: 250
    height: 75

    Text {
        id: textItem
        x: 10; y: 10
        text: "how can I fix my shadow?"
    }

    DropShadow {
        id: shadowEffect
        anchors.fill: textItem
        source: textItem

        radius: 8
        samples: 16

        horizontalOffset: 20
        verticalOffset: 20
    }
}
Run Code Online (Sandbox Code Playgroud)

qt qml qt-quick

6
推荐指数
1
解决办法
1880
查看次数

Qt 5:在Loader中读取属性

如何timeout在Qt5 QML Quick 2.0中读取位于Loader对象内的属性?

import QtQuick 2.0

Rectangle {
    width: 100
    height: 100
    color: "black"

    property Component comp1 : Component {
        Rectangle {
            id: abc
            property int timeout: 5000
            width: 10; height: 10;
            color: "red"
        }
    }

    Loader {
        id: loader
        sourceComponent: comp1
    }

    Component.onCompleted: console.log( "timeout: " + loader.item.abc.timeout )
}
Run Code Online (Sandbox Code Playgroud)

TypeError:无法读取undefined的属性'timeout'

qt qml qt-quick qt5 qtquick2

6
推荐指数
1
解决办法
2331
查看次数

Direct3D场景之上的QtQuick 2.0场景

我一直试图想出一个解决方案,将QtQuick 2.0场景与Direct3D场景一起使用很长一段时间,但不是很成功.我的目标是让Direct3D引擎以合理的速度(60 FPS?)与QML UI一起运行.这两件事都可以自己运行150-200 FPS.但是当被迫在一个窗口内合作时,一切都只是香蕉.我调查了几种方法,但似乎没有一种方法足够:

解决方案A:将Direct3D场景渲染到纹理中,使用QImage和QQuickPaintedItem进行可视化

  • 这个解决方案效果很好,并且它似乎是网上其他人的首选.然而,它很慢.全高清无法超过18-20 FPS.从每个帧的GPU(D3D)到CPU(QImage)再到GPU(QML渲染器)的纹理传输链中明显存在瓶颈.尤其是QML端的CPU-> GPU处理速度太慢了!

解决方案B:将QtQuick场景渲染到FBO中,然后使用Direct3D纹理

  • 这基本上是以前的解决方案.当UI不需要更新时,速度会更好一些.一旦开始制作动画,一切都会再次下降到18-20 FPS.QOpenGLFramebufferObject :: toImage()显然需要时间.在两侧实施纹理/ FBO双缓冲以减少失速并没有多大帮助.

解决方案C:在具有Direct3D场景的QWidget顶部启用透明度的QQuickView

  • 这种方法也不幸运.只有当QQuickView在自己的窗口中时,透明度似乎才有效.一旦我把它放在同一个窗口的D3D QWidget之上,它立即停止工作并变得完全不透明.有人试图在那里做类似的事情:http://qt-project.org/forums/viewthread/5484,但我根本没有运气解决方案.也许保持两个完全分开的窗口(主D3D窗口+无框透明QML窗口)一直在彼此之上就可以了,但这听起来很傻.

解决方案X:修改ANGLE库并尝试使用Direct3D渲染器提取和共享D3D设备上下文

  • 还没有尝试过,尽可能避免任何库修改.这甚至是一个明智的选择吗?

我这里显而易见的问题是:我做错了吗?什么是首选解决方案?A,B,C,X或者可能是完全不同的东西?有人能指出我正确的方向吗?

TL; DR: 在Direct3D场景之上渲染QML场景的最快方法是什么?

qt direct3d qml qt-quick qtquick2

6
推荐指数
1
解决办法
677
查看次数

QML 表单布局

我在我的应用程序中使用 QML 作为 UI,现在我想构建一些表单。这是一个代码:

Window {
    width: 400
    height: 600
    flags: Qt.Dialog
    modality: Qt.ApplicationModal

    GridLayout {
        id: mainLayout
        columns: 2
        rowSpacing: 5
        columnSpacing: 5
        anchors {
            top: parent.top;
            left: parent.left
            right: parent.right
        }

        Label { text: "field1" }
        TextField { id: field1; }

        Label { text: "field2"}
        TextField { id: field2 }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何设置TextFields 的宽度?他们中的大多数必须适合右列中的所有空间。

现在的样子:

在此处输入图片说明

qt qml qt-quick qtquick2 qtquickcontrols

6
推荐指数
1
解决办法
2500
查看次数

无法连接到 QML 仿真层(QML Puppet)

我刚刚安装了全新的 QT,当我创建空的 QT Quick 项目或打开任何现有的 QT Quick 示例时,我的 QML 设计器不起作用。它显示“无法连接到 QML 仿真层(QML Puppet)”错误。

我尝试重新安装 QT、重新启动、安装其他 QT 套件版本并尝试在套件的 32 位/64 位默认/opengl 版本之间切换,但似乎对我没有任何作用。我能够成功运行设计器一次,在我关闭它并尝试重新打开文件后,它再次停止工作。我也尝试搜索,但没有找到任何解决方案。我也尝试在QT论坛上提问,但没有得到任何答复。

我的系统是 Windows 7,安装了 Visual Studio 2013。谢谢你的帮助!

c++ qt qt-creator qml qt-quick

6
推荐指数
2
解决办法
6389
查看次数

用QML测量经过的时间

让我们考虑以下示例:我们有一个Qt Quick Controls Button.用户在5秒内点击两次.在Button第一次推送之后,QML Timer正在运行这5秒钟.我们希望测量两次点击之间经过的时间,精确度为毫秒.

不幸的是,QML Timer无法向我们显示经过的时间.

正如BlackBerry论坛上所建议的那样,可以比较日期.但是,这不是很方便,因为第一次点击可能发生在31 Dec 2015, 23:59:55第二次点击,第二次点击1 Jan 2016, 00:00:05,检查必须是复杂的.

还有更好的选择吗?

time qt qml qt-quick qtquick2

6
推荐指数
3
解决办法
9742
查看次数

从 QML 动态创建 C++ 对象

我想C++QML. 我创建了一个QObject名为的派生类Car并将其公开给QML使用qmlRegisterType<Car>("org.qtproject.models", 1, 0, "Car");. 在里面,QML我能够实例化一个Car这样的对象:

Car {
    id : car_1
    carName : "H1"
    carBrand : "Hummer"
    carPrice : 125000
} 
Run Code Online (Sandbox Code Playgroud)

然后使用该car_1对象并C++在需要时轻松将其传回。但我想是创建一个Car动态的对象QML,这样我就可以把它传递回C++

我试过:

MouseArea
{
    anchors.fill: parent
    onClicked: {
        component = Qt.createQmlObject("Car { id: car_1; carName : \"H1\"; carBrand : \"Hummer\"; carPrice : 125000; }",
                                       parent, "dynamicSnippet1");

        myCarModel.appendRowFromQml(component);
    }
}
Run Code Online (Sandbox Code Playgroud)

但没有运气。使用静态方法,工作正常:

MouseArea
{
    anchors.fill: …
Run Code Online (Sandbox Code Playgroud)

c++ qt qml qt-quick qtquick2

6
推荐指数
1
解决办法
3943
查看次数

更新数据时如何更新 QAbstractItemModel 视图

我使用Qt example for QAbstractItemModel并尝试将 更新为Item给定的index.

我尝试使用emit DataChanged但它不起作用,视图未更新

下面是一个例子:

我想什么:当你点击按钮,它会在索引0更新数据,该type动物将被改变,它会成为一个狮子

#include <QAbstractListModel>
#include <QStringList>
#include <qqmlcontext.h>
//![0]
class Animal
{
public:
    Animal(const QString &type, const QString &size);
//![0]

    QString type() const;
    QString size() const;

    void setType(QString q) {
        m_type = q;
    }

private:
    QString m_type;
    QString m_size;
//![1]
};

class AnimalModel : public QAbstractListModel
{
    Q_OBJECT
public:

    Q_INVOKABLE void test() ;
    void setName(const QString …
Run Code Online (Sandbox Code Playgroud)

qt qabstractitemmodel qml qt-quick

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

Qt/QML:带有内联 QML 元素的文本

我们正在使用 QtQuick/QML 构建图形用户界面。我们有一些来自数据库的动态多行文本,它们应该显示在应用程序中。目前,我们正在使用Text元素来显示文本。但是,我们需要将一些 QML 组件内联嵌入到文本中。为此,来自数据库的文本包含占位符,例如::checkbox|1::应该由程序替换和显示的。

在 HTML 中,这很容易,您可以简单地将内联元素与文本混合以产生如下结果:

在此处输入图片说明

但在 QML 中,这似乎更困难,因为Text如果空间不足(文本和容器大小都应该是动态的),则元素无法自动换行成两半。

我们能想出的最佳解决方案是为每个单词创建Flow一个Text元素的布局,但这似乎太hacky了。RichText与 HTML 一起使用还不够,因为我们确实需要在文本中自定义 QML 元素。此外,WebView由于性能原因,我们希望避免使用 a 。

是否有一种复杂的方法可以仅使用 QML/C++ 来实现?

c++ qt text qml qt-quick

6
推荐指数
1
解决办法
899
查看次数

在 Raspberry PI 4 上运行 PySide6 和 GPIO

最近我买了一台全新的 Raspberry Pi 4B,内存为 8Gb,并安装了 Ubuntu Desktop 21.04。

我的目标是在触摸屏上创建一个 GUI,用于控制 GPIO 引脚(某些硬件设备)。

由于控制 GPIO 是由 Python 完成的,所以我也想用它来编写 GUI。我看了几个教程,决定使用 PySide6 + Qt Quick。这种程序在我的个人笔记本电脑上运行良好,但当尝试下载 Raspberry 上所需的依赖项时,例如:

python3.9 -m pip install PySide6

我收到以下错误:

ERROR: Could not find a version that satisfies the requirement PySide6 (from versions: none)
ERROR: No matching distribution found for PySide6
Run Code Online (Sandbox Code Playgroud)

我认为这个问题可能是由交叉编译引起的。

您知道是否有机会在 Raspberry Pi 4B 上运行 PySide6 和 QtQuick?

更新

在采用 Manjaro ARM KDE Plasma 21.07 64 位操作系统的 Raspberry Pi 4B 上进行测试

运行以下命令:

* Update the package database …
Run Code Online (Sandbox Code Playgroud)

user-interface pyside qt-quick raspberry-pi pyside6

6
推荐指数
1
解决办法
2251
查看次数