编程 QGraphicsView 滚动未正确更新

2023-11-26

我有一个从 QGraphicsView 派生的自定义类,它实现了一个槽调用scrollHorizo​​ntal(int dx),里面的代码很简单

void CustomView::scrollHorizontal(int dx){
    scrollContentsBy(dx, 0);
}

我的问题是,像这样滚动可以工作,但不能正确更新场景,而是重复在视图边缘找到的任何像素,而不是重新调用项目的paint() method.

我尝试过打电话update()之后,但什么也没有发生。我尝试通过拖动启用滚动并且更新工作正常!但我需要以编程方式完成它,因为我有滚动条隐藏了诸如horizontalScrollBar()->setValue()不要滚动视图。

我也尝试过:

scrollContentsBy(dx, 0);
this->scene()->invalidate(sceneRect());
this->update();

update:

QPointF center = mapToScene(viewport()->rect().center()); 
centerOn(center.x() - dx, center.y()); 
update(); 

正在工作,但现在我的顶视图滚动速度比底视图慢,这是一个新问题。它们与signals and slots,在底部视图中我有scrollContentsBy(int dx, int dy)覆盖到emit horizontalScroll(dx);这是由上面捕获的slot在顶视图中。

有什么想法为什么卷轴会以不同的速度发生吗?这可能与滚动条作为底部视图的一部分有效使其成为“较小”窗口有关吗?

更新2:

不同的滚动速率似乎源于一些舍入发生,给我一个基于整数的“中心”使用mapToScene(viewport()->rect().center());,当您滚动时,滚动得越慢,该错误累积得越多,滚动得越快,总错误就越少。

我有办法解决这个问题吗?我没有看到任何方法来获得浮点中心点。

更新3:

所以我已经基本解决了这个问题,结果发现需要mapToScene(我在网络其他地方找到的代码)。

我通过存储解决了这个问题QPointFFP 计算视口的中心,现在滚动两个视图时的错误量是不明显的。

最后一个问题是,当您向右滚动任意量,然后调整窗口大小然后再次滚动时,视图不再排列。我认为这与计算中心点和居中发生的逻辑顺序有关。

现在我在中使用以下代码片段QGraphicsScene::ResizeEvent()以及根据需要更新中心的其他地方

QRectF viewPort(viewport()->rect());
QPointF rectCenter((viewPort.x() + viewPort.x() + viewPort.width())/2.0, (viewPort.y() + viewPort.y() + viewPort.height())/2.0);

viewCenter = rectCenter;

and my horizontalScroll(int dx) slot

void CustomView::horizontalScroll(int dx)
{
    viewCenter.setX(viewCenter.x() - dx);
    centerOn(viewCenter.x(), viewCenter.y());
    update();
}

重新调整窗口大小时如何解决破坏两个视图对齐的问题?如果需要更多说明,请询问,如果需要,我可以尝试给出我所指内容的框架。

更新4:

粗略代码骨架

Class HeaderView:

class HeaderView View : public QGraphicsView
{
    Q_OBJECT
public:
    HeaderView(QWidget * parent = 0);
    HeaderView(QGraphicsScene * scene, QWidget * parent = 0);

private:
    QPointF viewCenter;

protected:
    void resizeEvent ( QResizeEvent * event );

public slots:
    void horizontalScroll(int);
    void addModel(qreal, qreal, const QString&);

};

标题视图.cpp

void HeaderView::resizeEvent(QResizeEvent *event)
{
    QGraphicsView::resizeEvent(event);
    QRectF viewPort(viewport()->rect());
    QPointF rectCenter((viewPort.x() + viewPort.x() + viewPort.width())/2.0, (viewPort.y() + viewPort.y() + viewPort.height())/2.0);

    viewCenter = rectCenter;
}

void HeaderView::horizontalScroll(int dx)
{
    viewCenter.setX(viewCenter.x() - dx);
    centerOn(viewCenter.x(), viewCenter.y());
    update();
}

类事件视图:

class EventView : public QGraphicsView
{
Q_OBJECT
public:
    EventView(QWidget * parent = 0);
    EventView(QGraphicsScene * scene, QWidget * parent = 0);
    QRectF visibleRect();

protected:
     void scrollContentsBy ( int dx, int dy );

signals:
    void horizontalScroll(int);

};

事件视图.cpp

void EventView::scrollContentsBy(int dx, int dy)
{
    QGraphicsView::scrollContentsBy(dx, dy);

    if(dx != 0){
        emit horizontalScroll(dx);
    }
}

MainWindow 类中的某处:

connect(eventView, SIGNAL(horizontalScroll(int)), headerView, SLOT(horizontalScroll(int));

我曾与QGraphicsView在 Qt 4.6.3 - 4.7.2 中并且不得不说你can使用各自的QScrollBar通过以下方式:

//graphics view initialization
QGraphicsView *graphicsView = new QGraphicsView(parent);
QGraphicsScene *scene = new QGraphicsScene(0,0,widthOfScene,heightOfScene,parent);
graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
graphicsView->setScene(scene);

//in another method
QScrollBar* yPos=graphicsView->verticalScrollBar();
yPos->setValue((int) newValue);

它们是否隐藏并不重要。他们仍然会回应setValue(int)只要您的图形场景大于图形视图。

The QGraphicsView也会回应ensureVisible,它将滚动条移动到适当的位置。

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

编程 QGraphicsView 滚动未正确更新 的相关文章

随机推荐

  • 在 C# 中使用 Linq 或 lambda 从数据库表中获取 X 个随机元素

    我有一个包含 x 个用户的数据库 我想随机获取所有用户 然后在我的网站上写下 50 个用户 现在我只使用 take 50 并检索最新 50 个用户 我希望它从整个表中随机洗牌 50 个 有什么想法吗 这就是我的代码现在的样子 userLis
  • %r 是什么意思?

    是什么意思 r在下面的声明中 print r 1 我想我听说过 s d and f但从未听说过这个 背景 在Python中 有两个内置函数用于将对象转换为字符串 str vs repr str应该是一个友好的 人类可读的字符串 repr应该
  • 防止 JSPX 创建自关闭标签 (
    !=

    JSPX 有一个可爱的旋转副作用 div class magic div Into div class magic div 对于许多浏览器来说 即使它是有效的 XHTML 这也会导致布局混乱 因此 我求助于使用 groovy 脚本通过以下正
  • jQuery DataTables 渲染列数据

    我正在使用 jQuery DataTables 显示来自 JSON 编码的 PHP 响应的信息 JSON 响应包含对象 名称 姓名 包含 全名 姓氏 ID 我一直在使用columns以我想要的方式显示数据 但是我遇到了一个我无法弄清楚的问题
  • 如何使用 wallet:accounts:read 请求访问所有用户帐户?

    当我的应用程序请求时wallet accounts read permission使用 Coinbase API v2 用户会看到一个包含所有帐户的下拉列表 他只能在三个可能的钱包中选择一个 如果我的应用程序想要与所有三个钱包 例如 BTC
  • Python:为什么(“hello”是“hello”)评估为True? [复制]

    这个问题在这里已经有答案了 为什么 hello is hello 生产True在Python中 我读了以下内容here 如果两个字符串文字相等 则它们已被置于相同的位置 内存位置 字符串是一个不可变的实体 没有伤害可以 做完了 那么每个 P
  • 添加列之前如何检查列是否存在

    我有一个数据库 如果它不存在 我想向其中添加一列 如何使用 sqlite swift API 做到这一点 通常 如果要向现有表添加新列 您将需要一个迁移路径 您可以使用userVersion管理数据库架构版本的属性 if db userVe
  • 一个用于验证美国和加拿大邮政编码的正则表达式

    我正在开发一个文具程序 客户可以选择美国或加拿大地区 当他们输入地址时 必须输入邮政编码 我正在尝试验证字段 但我无法对美国或加拿大使用 reg exp 我需要一个可验证两个国家 地区邮政编码的正则表达式 不知道您使用的是什么语言 我不会使
  • 垂直对齐属性如何工作?

    我不明白什么时候vertical align会和不会工作 每次我遇到一个用例vertical align至于它是否真的有效 这似乎是一个抛硬币的问题 我知道它必须应用于内联元素 我读到我必须指定一个line height对于通常没有的元素
  • Echoprint iOS 缺少框架

    有人下载过 EchoPrint 的 iOS 演示版本吗 它是一个音频指纹开源软件 我刚刚下载了它 但它似乎缺少框架 有什么地方可以获得功能版本吗 按照步骤使其框架运行 下载最新版本boost 下载link最新 1 51 0 的 boost
  • 无法启动 GlassFish 4.0 (Windows) - 端口 1527 - 地址已在使用中

    我是 Java EE 7 的新手 我有 Netbeans 7 4 GlassFish 4 0 和 Java EE 7 在 64 位 Windows 8 1 Pro 计算机中 我想要启动 GlassFish 4 0 Server 因此单击 N
  • 如何使用 Ramda 实现使用无点递归来删除对象中的空值?

    我正在学习 pointfree 函数 并尝试以这种风格实现这个递归空值删除器 有效 但是是not无点 function removeNulls obj return R ifElse R either R is Array R is Obj
  • 如何使用mongoose在mongodb中存储图像?

    任何人都有一个使用 mongoose 和 Nodejs Express 在 mongodb 中插入图像的快速示例 我读了一些例子 但我不明白如何做到这一点 我想以表格形式上传图片 app post videos new function r
  • Emacsclient 钩子上的kill

    我试图在 Emacs 中找到一个钩子 它应该在 emacs 服务器正常关闭之前触发 我尝试使用 elisp 来执行kill emacs query functions kill emacs hook server done hook 如下所
  • 如何在打乱的连续整数数组中查找重复元素?

    我最近在某处遇到一个问题 假设您有一个包含 1001 个整数的数组 整数按随机顺序排列 但您知道每个整数都在 1 到 1000 含 之间 此外 除了一个数字出现两次之外 每个数字在数组中只出现一次 假设您只能访问数组的每个元素一次 描述一种
  • JavaScript内部方法实现源码

    有没有办法查看 JavaScript 方法背后的代码 不是网站 html 或 js 文件中的 javascript 方法 而是 JavaScript 的内部方法 例如 我怎样才能看到JavaScript如何计算offsetTop一个元素的
  • MySQL DATETIME DIFF 查询

    我有一个 MySQL 查询 每 30 分钟通过 cron 运行一次以删除旧的属性列表 查询是 DELETE FROM wpdb gt posts WHERE post type rentals AND DATEDIFF NOW post d
  • 在 vuejs2 数据中动态插入子组件(无需 $compile 或滥用 v-html)

    我想在不一定是预定义的 HTML 块中的任意点动态插入新的 vuejs 组件 这是一个稍微做作的示例 演示了我正在尝试做的事情 Vue component child pretend I do something useful templa
  • 将字符串、整数和浮点数序列化为字符数组,以便在没有库的情况下进行网络连接

    我想通过网络传输数据 但我不想使用任何外部库 标准C C 就可以 例如 unsigned int x 123 char y 3 h i 0 float z 1 23f 我想要这个 char xyz 11 array 笔记 为了通过网络传输它
  • 编程 QGraphicsView 滚动未正确更新

    我有一个从 QGraphicsView 派生的自定义类 它实现了一个槽调用scrollHorizo ntal int dx 里面的代码很简单 void CustomView scrollHorizontal int dx scrollCon