Qml中的QScrollArea:Flickable + QQuickPaintedItem

2024-04-19

我正在尝试实现类似的东西QScrollArea(在小部件世界中)在 Qml 的帮助下。 我决定一探究竟Flickable plus QQuickPaintedItem基于项目(在我的例子中名为抽屉):

Flickable {
  ...
  onContentXChanged(): {
  drawer.update()
  }

Drawer {
  id: drawer
  ...
}

抽屉的渲染目标设置为FrameBufferObject。它的绘制函数如下所示:

void Drawer::paint(QPainter *painter)
{
   // Some function to compute rect which is needed to be redrawn
   QRect updateRect = computeUpdateRect();

   // How to shift contents of Frame buffer, e.g. to right, and draw only updateRect in this space?
}

想象一下我们如何滚动QScrollArea小部件,例如向左:视口的所有条目都向右移动,并且左侧唯一的小矩形被重新绘制。 我想做同样的事情Flickable+QQuickPaintedItem。但我无法理解一些事情:

如何操作内部的帧缓冲区对象QQuickPaintedItem? 也许有一些更正确的方法来实施QScrollArea in QML?

顺便说一句,双缓冲默认启用QQuickPaintedItem?

用于实施Flickable: 提供有关任务的更多信息:我有一张非常大的“图片”。所以我无法将它整个加载到内存中,但我必须使用像视口这样的东西来浏览它。


当您想要将较大的内容封装在较小的区域中并在其周围导航时,可以使用滚动区域或可滑动区域。就你而言,情况并非如此。您实际上并没有使用滚动区域,因为您的图像永远不会大于滚动区域的大小,您只是想伪造它,这实际上很简单:

#include <QQuickPaintedItem>
#include <QImage>
#include <QPainter>

class PImage : public QQuickPaintedItem {
    Q_OBJECT
public:
    PImage(QQuickItem * p = 0) : QQuickPaintedItem(p), xpos(0), ypos(0) {}
    void paint(QPainter *painter) {
        if (!source.isNull()) painter->drawImage(QRect(0, 0, width(), height()), source, QRect(xpos, ypos, width(), height()));
        else painter->fillRect(QRect(0, 0, width(), height()), Qt::black);
    }
public slots:
    bool load(QString path) {
        source = QImage(path);
        return !source.isNull();
    }
    void moveBy(int x, int y) {
        int ox, oy;
        // don't go outside the image
        ox = x + xpos + width() <= source.width() ? x + xpos : source.width() - width();
        oy = y + ypos + height() <= source.height() ? y + ypos : source.height() - height();
        if (ox < 0) ox = 0;
        if (oy < 0) oy = 0;
        if (ox != xpos || oy != ypos) {
            xpos = ox;
            ypos = oy;
            update();
        }
    }
private:
    QImage source;
    int xpos, ypos;
};

在 QML 方面:

PImage {
    width: 300
    height: 300
    Component.onCompleted: load("d:/img.jpg") // a big image
    MouseArea {
        property int ix
        property int iy
        anchors.fill: parent
        onPressed: {
            ix = mouseX
            iy = mouseY
        }
        onPositionChanged: {
            parent.moveBy(ix - mouseX, iy - mouseY)
            ix = mouseX
            iy = mouseY
        }
    }
}

这只是一个快速的基本示例,还有很多需要完善和改进的空间。另请注意,如果源矩形与目标矩形的大小不同,您可以轻松实现放大或缩小。您可以将其挂接到可轻拂的对象上以获得“动态滚动”而不是鼠标区域。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qml中的QScrollArea:Flickable + QQuickPaintedItem 的相关文章

  • 在没有加载器的情况下实例化内联组件

    有没有办法实例化内联Component 即在同一文件中定义 而不使用Loader 我不太关心使用的性能影响Loader因为我要用很多东西污染我的文件Loader包装纸 我发现从 JavaScript 创建动态 QML 对象 http doc
  • 获取 QListView 中所有可见项目的简单方法

    我正在尝试使用 Qt Framework 开发一个图像库应用程序 应用程序从所选文件夹加载所有图像 并使用 QListView 控件显示这些图像 但现在我想通过仅加载用户可见的图像来减少内存消耗 由于没有直接函数来获取视图中的所有可见项目
  • C++ SQL 查询构建库

    我正在寻找一个提供与 c SelectQueryBuilder 库类似功能的 c 库 http www codeproject com Articles 13419 SelectQueryBuilder Building complex a
  • 如何去除QWizard中的水平线?

    我正在研究一个样式表QWizard我想删除按钮上方的水平线 我尝试递归浏览所有小部件并将其边框设置为无 但似乎没有任何小部件具有此边框 这是我的代码 可以找到完整的可构建示例here https gist github com ardeid
  • 在 Qt 中使用多个不同的流读取同一文件

    使用 Qt 是否可以使用多个流读取文件以同时访问其中的不同数据部分 请注意 Qt 中的流 QTextStream QDataStream 不处理底层设备中的位置 流类只是一个包装器 用于更轻松地解析设备 QFile 实例 内的二进制数据 因
  • Mac OS X 上的 Qt 字体系列和样式

    我有一个基于 Qt PyQt 的 GUI 应用程序 在 Mac OS X 和其他平台 上运行 它允许用户选择字体并具有粗体和斜体选项的复选框 在更新到新的基于 Cocoa 的 Qt 时 用户发现QFontComboBox不再显示不同的字体样
  • 是否有 Qt 小部件可以浏览应用程序中小部件的层次结构(类似于 Spy++)?

    我们有一个具有复杂的小部件层次结构的应用程序 我希望能够以与 Spy 类似的方式浏览此层次结构 查看和编辑属性 例如大小 如果有一个小部件可以显示此信息 则它不需要在外部应用程序中运行 那么问题来了 这样的神兽存在吗 您可以使用Gammar
  • Qt中Q_PROPERTY的意义是什么?

    我无法理解 Q PROPERTY 的用法 Q PROPERTY 如何帮助程序具有防御性 它是干什么用的 我看过这个论坛 但确实无法应用 我已经理解了这个例子 但不明白它的用法 这是一个例子 我能从中得到什么 我知道阅读将赋予只读特权 wri
  • 使用 QGraphicsScene 实现流畅的动画

    我希望我的问题并不总是同样的问题 我有一个 QGraphicsScene 它的项目是一些 QGraphicsPixmap 我用一个计时器来移动它们 每秒 SetX 10 我设置 10是因为窗口大100 使用这个解决方案我的动画不流畅 我想我
  • QFileSystemModel setRootPath

    我正在尝试创建一个 Qt 应用程序来显示文件夹 Mac OS 中的 Users 文件夹 的内容 这是代码 QFileSystemModel dirModel new QFileSystemModel dirModel gt setRootP
  • Qt 支持 Windows 蓝牙 API 吗?

    谁能告诉我 Qt 是否支持 Windows 蓝牙 API 如果是这样 您能否分享一些有关如何使用它的信息 自上次答复以来 这个问题的答案发生了一些变化 Qt 5 2 版为 Linux BlueZ 和 BlackBerry 设备实现了蓝牙 A
  • 如何向 PyQt5 GUI 添加线程?

    所以我使用 QT Designer 创建了一个 GUI 它工作得很好 但在更复杂的调用中 它不会更新主窗口并锁定 我想运行我的CustomComplexFunction 在根据不断变化的后端信息更新主窗口中的文本编辑时 我希望它每 2 秒运
  • QAbstractItemModel 如何表示树?

    我仍然很难理解 QAbstractItemModel 对项目的表示 有两种返回 QModelIndex 项的方法对我来说没有任何意义 QModelIndex QAbstractItemModel index int row int colu
  • 在 Qt GraphicsView 中创建长线(或十字线)光标的最佳方法

    创建长十字线光标 与视口一样长 的简单方法是创建一条十字线graphicsItem 当鼠标移动时 设置该项目的pos财产 但是当场景复杂时这种方式会很慢 因为它要更新整个视口来更新光标的pos 另一种简单的方法是setCursor QCur
  • Qt:将数字转换为 QString、QVariant 或 QString::number 哪个更好

    我只是好奇 比方说 我需要在控制台中输出一个数字 代码是 include
  • 使用 C++ 访问 Azure blob 存储 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么动态 qml 对象的创建如此缓慢,有哪些合理的替代方案?

    我想要实现的目标类似于棋盘游戏 有一个100 100的网格 放在一个Item它驻留在一个Flickable 游戏板 的各个矩形都是 svg 图像 目前大约有 20 种 可能会增加到数百种 作为基准测试 我只是尝试用元素填充 世界 Compo
  • 使用 QWT 构建时出错

    我收到一个错误 undefined reference to QwtPlot QwtPlot QWidget 当我尝试构建我的项目时 即使设置中一切看起来都很好 在我的 CmakeLists txt 中我有 include director
  • 使用 qbs 构建 qt 应用程序

    我想知道在 Linux 上使用 qbs 编译 构建和创建 Android Qt 应用程序的步骤 我拥有所有必要的工具 目前我可以使用 qmake 创建 apk Qbs 目前不支持构建 Qt Android 应用程序 Qbs v1 4 中引入
  • Qt 5.3 QPlainTextEdit 更改 QTextCursor 颜色

    我想更改下面的光标颜色QPlainTextEdit小部件 我能够将其宽度设置为6 但我想改变颜色或者它 是否可以 QFontMetrics fm font setCursorWidth fm averageCharWidth setCurs

随机推荐

  • 将项目 own_to 关系添加到 Active Admin

    我正在为我的 Rails 应用程序使用活动管理 我有一个客户模型 它属于一个部门 也属于一个交货时间 在我的管理文件夹中 我有一个用于主动管理的 customer rb 文件 该文件看起来像这样 ActiveAdmin register C
  • 如何将数据库从本地主机移动到实时服务器

    我使用 Xampp 构建了一个数据库和网站 它允许我使用和测试 php 以及托管在本地主机上的数据库 我现在想将其移至实时服务器 我已使用 123 reg 将网站移至实时服务器 如何移动数据库 我尝试导出 phpmyadmin 数据库并将
  • 从单独的键和值列表创建字典(dict)

    我想将这些结合起来 keys name age food values Monty 42 spam 放入单个字典中 name Monty age 42 food spam 我怎样才能做到这一点 像这样 keys a b c values 1
  • .htaccess:如何通过IP限制对单个文件的访问?

    我已经查看了所有内容 但不断遇到有关目录级 IP 限制的相同信息 通常如下所示 Order Deny Allow Deny from all Allow from 123 123 123 123 是否可以将相同类型的访问限制绑定到页面 文档
  • 高级分析对于所选进程不可用

    我正在尝试使用 3 0 中的 Android Studio 分析器分析 APK 由于我使用的不是 Android 7 0 因此我必须在模块配置中显式打开高级分析 问题是 完成此操作后 Android Studio 仍然显示 高级分析对于所选
  • 如何在管理面板中显示插件激活通知?

    当我激活测试插件时 我试图在管理面板中显示通知 我怎样才能显示它 那个方法是什么 对于插件激活 不能直接使用 admin notices 挂钩 因为存在重定向 解决方法是将您的通知存储在选项表中 并在下次检查 另外 如果您还想涵盖插件升级和
  • Django 表单验证:获取 JSON 格式的错误

    我有这个非常简单的 Django 表单 from django import forms class RegistrationForm forms Form Username forms CharField Password forms C
  • c# listview取消选择项目

    我正在开发一个 Windows 应用程序 它有一个包含一堆项目的 ListView 当用户单击某个项目时 应用程序会显示该项目的详细信息 这 然后用户就有机会编辑这些详细信息 用户应该单击 每次更改后都会单击 保存 按钮 但当然这种情况并不
  • 如何解析没有对象名称的 JSON 数组

    我将如何在 Java 中解析这个 JSON 数组 我很困惑 因为没有对象 谢谢 编辑 我是个白痴 我应该阅读文档 这可能就是它的用途 id 63565 name Buca di Beppo user null phone 408 377 7
  • Python Flask 导入未导入模块的错误

    我有一个在 Google App Engine 中运行的 Flask 应用程序 昨天 我部署了应用程序的新版本 其中仅更改了 HTML 样式 它按预期部署 今天 我意识到我没有更改每个相应 HTML 页面的标题 因此我只更改了每个 HTML
  • android服务的onCreate未调用

    我想以静态方式启动服务 所以从我的活动中我打电话 SpeechActivationService makeStartServiceIntent this getApplicationContext WordActivator 这是从服务类扩
  • 在 VIM 中切换语法高亮的隐藏属性

    我目前有一个解析日志文件的语法文件 与以下内容非常相似 这是针对 syslog 的 syn match syslogText syn match syslogFacility 1 nextgroup syslogText skipwhite
  • 如果缺少一台主机,Datastax Java 驱动程序将无法连接

    如果我没记错的话 可以连接到 Cassandra 集群 至少知道集群中的一个节点 然后可以发现其他节点 假设我有三个节点 1 2 和 3 并且我像这样连接到这些节点 Cluster builder addContactPoints 1 2
  • jquery选择器在ajax加载时找不到元素

    没有任何 jQuery 选择器能够通过 Ajax 请求处理从服务器加载的元素 但它在正常模式下工作得很好 myid change function alert OK
  • 如何继承 ASP.NET MVC 控制器并仅更改视图?

    我有一个从基本控制器继承的控制器 我想知道如何利用基本控制器的所有逻辑 但返回与基本控制器使用的不同的视图 基本控制器填充模型对象并将该模型对象传递到其视图 但我不确定如何在子控制器中访问该模型对象 以便将其传递到子控制器的视图 有几点 如
  • 这种基于 Flexbox 的布局是否需要额外的标记?

    我现在开始使用 Flexbox 尝试了解如何从使用传统 CSS 网格过渡 我有两种布局 一种是用 CSS 网格制作的 另一种是使用 Flexbox 制作的 这两个示例的基本布局都非常基本 页眉 导航 内容部分和页脚 从设计角度来看 它们看起
  • Rails 5.1.1 弃用警告已更改_属性

    我刚刚从 Rails 5 0 0 升级到 5 1 1 并开始收到大量弃用警告 如下所示 弃用警告 的行为changed attributes代替 after 回调将在下一版本的 Rails 中发生变化 新的 返回值将反映之后调用该方法的行为
  • 阻止 UIScrollView 的子视图调整大小?

    我有一个UIScrollView 具有由返回的视图的多个级别的子视图viewForZoomingInScrollView 在缩放期间 我希望其中一些子视图调整大小 而其他子视图不调整大小 无论我尝试什么 所有子视图都会调整大小 在子视图的超
  • 查询 mongodb 返回今天创建的文档

    我如何编写今天创建的结果文档的过滤器 我知道 ObjectId 有时间戳 我试过这个 db doc find id gte ObjectId getTimestamp getTime 我可以写吗 db doc find id getTime
  • Qml中的QScrollArea:Flickable + QQuickPaintedItem

    我正在尝试实现类似的东西QScrollArea 在小部件世界中 在 Qml 的帮助下 我决定一探究竟Flickable plus QQuickPaintedItem基于项目 在我的例子中名为抽屉 Flickable onContentXCh