Qt实现绘制网格背景的示例代码

 更新时间:2022年06月07日 14:06:01   作者:la_vie_est_belle  
这篇文章主要介绍了Qt如何实现绘制网格背景,并且能实现窗口大小调整时网格背景也自动调整重绘,感兴趣的小伙伴可以跟随小编一起学习一下

现有功能

  • 使用滚轮缩放。
  • 缩放到达一定阈值后恢复网格大小。
  • 窗口大小调整时网格背景也自动调整重绘。

运行结果

源码

window.h

#ifndef WINDOW_H
#define WINDOW_H

#include <QWidget>
#include <QPen>
#include <QPainter>
#include <QPaintEvent>

class Window : public QWidget
{
    Q_OBJECT

public:
    Window(QWidget *parent = nullptr);
    ~Window();

protected:
    void paintEvent(QPaintEvent *event);
    void wheelEvent(QWheelEvent *event);
    void resizeEvent(QResizeEvent *event);

private:
    void setBackgroundColor();              // 设置窗口背景颜色
    void drawRowLines(QPainter *painter);   // 绘制横线
    void drawColLines(QPainter *painter);   // 绘制竖线

private:
   int minGap;                              // 最小线间隔
   int maxGap;                              // 最大线间隔
   float gap;                               // 当前线间隔
   float startX;                            // 竖线初始x坐标(从窗口中间开始)
   float startY;                            // 横线初始y坐标(从窗口中间开始)
   QPen lightPen;                           // 细一点的画笔
   QPen darkPen;                            // 粗一点的画笔
};
#endif // WINDOW_H

window.cpp

#include "window.h"
#include <QColor>
#include <QPalette>
#include <QPointF>

Window::Window(QWidget *parent)
    : QWidget(parent)
{
    this->minGap = 4;
    this->maxGap = 14;
    this->gap = (this->minGap + this->maxGap) / 2;
    this->startX = this->width() / 2;
    this->startY = this->height() / 2;
    this->lightPen = QPen(QColor(222, 222, 222));
    this->darkPen = QPen(QColor(222, 222, 222));
    this->darkPen.setWidth(2);

    this->setBackgroundColor();
}

Window::~Window()
{
}

void Window::setBackgroundColor() {
    QPalette palette;
    palette.setColor(QPalette::Background, QColor(250, 250, 250));
    this->setPalette(palette);
    this->setAutoFillBackground(true);
}

void Window::drawRowLines(QPainter *painter) {
    int lineCount = 0;
    float biggerY = this->startY;
    float smallerY = this->startY;

    painter->setPen(this->darkPen);

    while (true) {
        painter->drawLine(QPointF(0.0, biggerY), QPointF(this->width(), biggerY));
        painter->drawLine(QPointF(0.0, smallerY), QPointF(this->width(), smallerY));

        biggerY += this->gap;
        smallerY -= this->gap;
        if (smallerY <= 0 || biggerY >= this->height()) {
            break;
        }

        // 每间隔一定数量的线,就画一条粗一点的横线
        lineCount += 1;
        if (lineCount == 10) {
            painter->setPen(this->darkPen);
            lineCount = 0;
        }
        else {
            painter->setPen(this->lightPen);
        }
    }

}

void Window::drawColLines(QPainter *painter) {
    int lineCount = 0;
    float biggerX = this->startX;
    float smallerX = this->startX;

    painter->setPen(this->darkPen);

    while (true) {
        painter->drawLine(QPointF(biggerX, 0.0), QPointF(biggerX, this->height()));
        painter->drawLine(QPointF(smallerX, 0.0), QPointF(smallerX, this->height()));

        biggerX += this->gap;
        smallerX -= this->gap;
        if (smallerX <= 0 || biggerX >= this->width()) {
            break;
        }

        // 每间隔一定数量的线,就画一条粗一点的竖线
        lineCount += 1;
        if (lineCount == 10) {
            painter->setPen(this->darkPen);
            lineCount = 0;
        }
        else {
            painter->setPen(this->lightPen);
        }
    }

}

void Window::paintEvent(QPaintEvent *event) {
    QWidget::paintEvent(event);
    QPainter painter(this);
    this->drawRowLines(&painter);
    this->drawColLines(&painter);
}

void Window::wheelEvent(QWheelEvent *event) {
    QWidget::wheelEvent(event);
    if (event->angleDelta().y() > 0) {
        this->gap += 0.1;
    }
    else if (event->angleDelta().y() < 0) {
        this->gap -= 0.1;
    }

    if (this->gap >= this->maxGap) {
        this->gap = this->minGap;
    }
    else if (this->gap <= this->minGap) {
        this->gap = this->maxGap;
    }

    this->update();
}

void Window::resizeEvent(QResizeEvent *event) {
    QWidget::resizeEvent(event);
    this->startX = this->width() / 2;
    this->startY = this->height() / 2;
    this->update();
}

main.cpp

#include "window.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Window w;
    w.show();
    return a.exec();
}

以上就是Qt实现绘制网格背景的示例代码的详细内容,更多关于Qt绘制网格背景的资料请关注脚本之家其它相关文章!

相关文章

  • 深入理解c/c++ 内存对齐

    深入理解c/c++ 内存对齐

    这篇文章主要介绍了c/c++ 内存对齐,有需要的朋友可以参考一下
    2014-01-01
  • Qt实现界面滑动切换效果的思路详解

    Qt实现界面滑动切换效果的思路详解

    这篇文章主要介绍了Qt实现界面滑动切换效果,主要包括设计思路及主要函数讲解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • 深入解析C中的数值与真假

    深入解析C中的数值与真假

    本篇文章是对C中数值与真假进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 浅析c++ 中const关键字

    浅析c++ 中const关键字

    const是一个C++语言的限定符,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。下面通过本文给大家分享c++ const关键字的相关知识,一起看看吧
    2017-06-06
  • C语言实现单词小助手功能完善版

    C语言实现单词小助手功能完善版

    这篇文章主要为大家详细介绍了C语言实现单词小助手功能的完善版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • 浅析C语言中堆和栈的区别

    浅析C语言中堆和栈的区别

    堆和栈都是一种数据项按序排列的数据结构。在C语言中是非常重要的知识点,接下来通过本文给大家介绍C语言中堆和栈的区别,感兴趣的朋友一起看下吧
    2016-06-06
  • C++实现二叉树及堆的示例代码

    C++实现二叉树及堆的示例代码

    这篇文章主要介绍了C++实现二叉树及堆的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • C语言规律循环累加求和案例

    C语言规律循环累加求和案例

    这篇文章主要介绍了C语言规律循环累加求和案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • MFC绘制不规则窗体的方法

    MFC绘制不规则窗体的方法

    这篇文章主要介绍了MFC绘制不规则窗体的方法,涉及MFC窗体操作的相关技巧,需要的朋友可以参考下
    2015-05-05
  • C语言经典例程100例(经典c程序100例)

    C语言经典例程100例(经典c程序100例)

    这篇文章主要介绍了C语言经典例程100例,经典c程序100例,学习c语言的朋友可以参考一下
    2018-03-03

最新评论