Qt如何实现绘制网格背景
Qt 实现 如何 绘制 背景 网格
2023-09-14 09:05:10 时间
现有功能
- 使用滚轮缩放。
- 缩放到达一定阈值后恢复网格大小。
- 窗口大小调整时网格背景也自动调整重绘。
运行结果
源码
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开发学习资料包、技术视频,内容包括(C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
相关文章
- 树莓派基于QT实现利用USB转485模块进行串口通讯「建议收藏」
- QT实现简单的上位机软件
- QT QMapIterator
- Qt面试笔试题问答经验总结
- C/C++ Qt TreeWidget 嵌套节点操作技巧
- 技术深入探索Linux下的Qt开发(基于linux的qt开发)
- Qt应用程序在Linux命令行下的运行(qtlinux命令行)
- Linux下Qt实现串口通信(linux下qt串口)
- 数据库使用Qt连接Oracle数据库:一步一步实现(qt连接oracle)
- qt实现mysql远程连接:快速入门指南(qt远程连接mysql)
- 使用 Qt 连接 MySql (qt使用mysql)
- 如何在Linux下编译Qt?(linux下编译qt)
- 的整合『使用 Qt 与MySQL实现创新性的数据库应用』(qt与mysql)
- GUI应用Linux下Qt开发GUI应用:实现梦想的开发之路(linux下qt开发)
- 快速搭建Qt环境中的MySQL数据库(qt配置mysql数据库)
- 集成开发Linux与Qt集成开发:实现无缝交互(linux与qt)
- 程序Qt与MySQL驱动程序:让您实现无缝连接(qtmysql驱动)
- QT实现对Oracle数据库的操作教程(qt操作oracle)
- Linux系统中实现Qt串口通信的完美指南(qt串口通信linux)
- 如何在QT应用程序中使用MYSQL进行编程?(qt的mysql编程)
- 使用Qt实现MySQL数据库连接教程(qt连接mysql数据库)
- 如何在Linux上运行QT程序?(linux运行qt程序)
- 借助Qt实现向MSSQL中快速插入数据(qt向mssql插入数据)
- 开发Linux应用程序:使用Qt图形界面(linux qt gui)
- MySQL与Qt的无缝连接(mysql 连接qt)