如何使用复选框更改 QGraphicsView 背景

2024-03-04

在此代码中,更改了QGraphicsView背景。现在当我检查 true 时我需要更改背景checkBox.当我设置为checkBox去检查true我需要像这段代码一样设置背景。当我设置时checkBox去检查false。我需要设置QGraphicsView对于正常的默认方式。我怎样才能做到这一点。

这是我的代码:

主窗口.cpp

#include "mainwindow.h"
#include <QGraphicsTextItem>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    scene = new Scene(this);
    scene->setSceneRect(10,10,260,200);
    view = new QGraphicsView(scene);
    setCentralWidget(view);
}

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGraphicsView>
#include "scene.h"
#include "customrectitem.h"

class MainWindow : public QMainWindow
{
public:
    explicit MainWindow(QWidget *parent = 0);
private:
    QGraphicsView* view;
    QGraphicsScene* scene;
};

#endif // MAINWINDOW_H

Scene.h

#ifndef SCENE_H
#define SCENE_H

#include <QGraphicsScene>
#include <QPainter>
#include <QApplication>

class Scene : public QGraphicsScene
{
    Q_OBJECT
public:
    explicit Scene(QObject *parent = 0);
    int getGridSize() const {return this->gridSize;}

protected:
    void drawBackground (QPainter* painter, const QRectF &rect);
private:
    int gridSize;

};

#endif // SCENE_H

场景.cpp

#include "scene.h"

Scene::Scene(QObject *parent) : QGraphicsScene(parent), gridSize(20)
{
    Q_ASSERT(gridSize > 0);
}

void Scene::drawBackground(QPainter *painter, const QRectF &rect)
{
        QColor c (10,140,255,155);
        painter->setPen(c);
        qreal left = int(rect.left()) - (int(rect.left()) % gridSize);
        qreal top = int(rect.top()) - (int(rect.top()) % gridSize);
        QVarLengthArray<QLineF,100> lines;
        for (qreal x = left; x < rect.right(); x += gridSize)
            lines.append(QLineF(x,rect.top(),x,rect.bottom()));

        for (qreal y = top; y < rect.bottom(); y += gridSize)
            lines.append(QLineF(rect.left(),y,rect.right(),y));
        painter->drawLines(lines.data(),lines.size());
}

虽然@Scheff https://stackoverflow.com/users/7478597/scheff的解决方案很好,但存在以下问题:

  • 第一个解决方案使其仅覆盖一小部分空间,如果更改 QGraphicsView 的大小,它将不会覆盖所有空间。

  • 第二个解决方案存在您正在使用的问题viewport()坐标,而不是场景,如果您添加一个项目,然后放大 QGraphicsView 而不移动该项目,那么您会看到一个滚动。

Initial:

改变尺寸后:

纠正这两个错误的解决方案是覆盖绘制背景 http://doc.qt.io/qt-5/qgraphicsscene.html#drawBackgroundQGraphicsScene的方法:

#ifndef GRAPHICSSCENE_H
#define GRAPHICSSCENE_H

#include <QGraphicsScene>
#include <QPainter>


class GraphicsScene: public QGraphicsScene{

    int mGridSize;
    QColor mGridColor;
    bool mGridVisible;

    Q_OBJECT
public:
    GraphicsScene(QObject *parent = Q_NULLPTR):QGraphicsScene(parent),
        mGridSize(20), mGridColor(0x0a8affu), mGridVisible(true)
    {

    }
    bool gridVisible() const {
        return mGridVisible;
    }
    void setGridVisible(bool gridVisible){
        if(mGridVisible != gridVisible){
            mGridVisible = gridVisible;
            update();
        }
    }
protected:
    void drawBackground(QPainter *painter, const QRectF &rect){
        if(mGridVisible) {
            QRect r = rect.toRect();
            int xmin  =r.left() - r.left()%mGridSize - mGridSize;
            int ymin = r.top() - r.top()%mGridSize - mGridSize;
            int xmax = r.right() - r.right()%mGridSize + mGridSize;
            int ymax = r.bottom() - r.bottom()%mGridSize + mGridSize;
            for(int x=xmin ; x <= xmax; x += mGridSize ){
                painter->drawLine(x, r.top(), x, r.bottom());
            }

            for(int y=ymin ; y <= ymax; y+= mGridSize ){
                painter->drawLine(r.left(), y, r.right(), y);
            }
        }
    }
};

#endif // GRAPHICSSCENE_H

这个解决方案的优点是它不加载任何新的对象,而且图形位于场景的坐标中,因此不存在第二个解决方案的位移。

Initial:

改变尺寸后:

The complete example can be found at the following link https://github.com/eyllanesc/stackoverflow/tree/master/questions/47728237

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

如何使用复选框更改 QGraphicsView 背景 的相关文章

  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • Android 后台服务示例,具有交互式调用方法

    我不是 Android 方面的专家 我正在寻找一个 Android 应用程序的示例 该应用程序使用一个服务 其中有真正的功能方法 或者换句话说 一个服务可以用来做什么 我们什么时候需要它 超越简单的东西服务举例 我确信您渴望获得一些工作代码
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • Azure 函数调用本机 C++

    我正在 Azure 中设计一个新的架构 它是一个多租户 SaaS 应用程序 具有 ASP NET MVC 前端和 blob 存储中的一些应用程序特定数据 我需要在某些时候对此应用程序数据执行一些后台处理 目前这只能使用一些遗留的 C 代码
  • 如果子文档值不存在,Mongodb 插入子文档

    我对 mongodb 很陌生 我有点迷失 我有 mongo 数据库集合 如下所示 id id createdAt new Date name name friends name 1 children name sarah age 12 do
  • html 或 java 脚本代码在硬盘中创建文本文件

    请有人给我一个代码来在硬盘驱动器中创建一个文本文件 结果应该是一个html文件 当双击 html 文件时 它需要在硬盘驱动器 本地 的给定路径中创建一个文本文件 谢谢 出于安全原因 浏览器中常规 HTML 页面中的 JavaScript 不
  • 构造函数中的默认参数--C++

    我有一个 C 类 其中有一个构造函数char char ostream 我想提供一个默认值ostream cerr 这是在标题或 cpp file 您需要将参数设置为参考参数 您不应该尝试复制std cerr 您可能需要在头文件中指定默认参
  • 更改 WPF 中单个/活动窗口的系统语言

    WPF 中是否可以仅更改一个窗口的系统语言 我知道关于InputLanguageManager但我认为它会改变整个系统的语言 InputLanguageManager 完全符合您的要求 它更改当前应用程序的键盘布局 操作系统为每个正在运行的
  • 有没有办法循环遍历 r 中的线性模型的列名称(而不是数字)?

    我有一个包含 40 个数据列 40 种不同的营养素 的数据表 还有用于绘图数字和因子的附加列 我想自动循环每个列名称并为每个列生成一个线性模型和摘要 数据列从第 10 列开始 for i in 10 ncol df for loop ove
  • 将带有 json 的 numpy 数组发送到带有请求的 Flask 应用程序

    使用请求 我需要在单个帖子中将带有 json 数据的 numpy 数组发送到我的 Flask 应用程序 我该怎么做呢 转换 numpy 数组arr到 json 时 可以将其序列化 同时保留维度json dumps arr tolist 然后
  • LIKE '%...' 如何在索引上查找?

    我期待这两个SELECT具有相同的执行计划和性能 由于有一个前导通配符LIKE 我期望进行索引扫描 当我运行这个并查看计划时 第一个SELECT行为符合预期 通过扫描 但第二个SELECT计划显示索引查找 并且运行速度快 20 倍 Code
  • 将散列数据作为散列的密钥传递再次返回不正确的结果

    我正在创建一个将使用 GAS 访问 AWS 服务的脚本 我使用实用程序库中的哈希函数来执行创建 v4 签名所需的所有哈希 这些函数似乎能够成功地对数据进行一次哈希处理 但尝试将哈希数据传递到参数中会产生不正确的结果 还有其他人遇到这个问题并
  • 在swift中实现函数

    我是 swift 的新手 试图实现一个简单的函数 该函数将最小和最大数字作为输入 并返回一个包含所有限制数字的数组 我收到错误 错误 对泛型类型 Array 的引用需要 中的参数 我可以知道我错过了什么吗 func serialNumber
  • Scikit-learn、KMeans:如何使用 max_iter

    我想了解类中的参数 max itersklearn cluster KMeans http scikit learn org stable modules generated sklearn cluster KMeans html 根据文档
  • Haskell:如何停止程序打印向左或向右

    我用 haskell 制作了一个计算器 我在 GHCi 中运行它 然而 由于最终的数字可以是整数或双精度数 我已经进行了类型声明 calc String gt Either Integer Double 然而 函数的输出总是在其前面有左或右
  • C++ 判断类是否具有可比性

    我或多或少是Java程序员 所以这可能是一个愚蠢的问题 但我没有找到任何简单的解决方案 我在 C 中有一个这样的类 template
  • JavaScript 排序方法处理大写字母

    注意到 JavaScript 可能有些奇怪的地方sort 方法 给定以下数组 var arr Aaa CUSTREF Copy a template Copy of Statementsmm Copy1 of Default Email T
  • 在 ColdFusion 中维护出站 TCP 连接池

    我希望从 ColdFusion 应用程序中大量使用 RESTful API 我不是 CF 专家 但我预计重复的 cfhttp 调用将成为瓶颈 因为我相信每次调用都会导致建立连接 发送请求 收到响应和断开连接 我很好奇 有没有办法维护一个连接
  • 在批处理文件中定义和使用变量

    我正在尝试在批处理文件中定义和使用变量 看起来应该很简单 echo off set location bob echo We re working with location 我得到的输出如下 We re working with 这里发生
  • jQuery Mobile 视口在 Windows Phone 中无法工作

    我正在 WindowsPhone 中测试 jQueryMobile 但视口无法正常工作 有一个解决方法这一页 http forum jquery com topic problem with virtual viewport size on
  • FireStore Tasks.whenAllComplete 与协程

    我想同步实现这段代码 但job join deferred await和火力基地await 不工作 有谁知道解决方案吗 CoroutineScope Dispatchers Main launch val job launch Tasks
  • 如何使用 System.Net.HttpClient 发布复杂类型?

    我有一个自定义复杂类型 我想使用 Web API 来使用它 public class Widget public int ID get set public string Name get set public decimal Price
  • 如何使用复选框更改 QGraphicsView 背景

    在此代码中 更改了QGraphicsView背景 现在当我检查 true 时我需要更改背景checkBox 当我设置为checkBox去检查true我需要像这段代码一样设置背景 当我设置时checkBox去检查false 我需要设置QGra