Qt實(shí)現(xiàn)繪制網(wǎng)格背景的示例代碼
現(xiàn)有功能
- 使用滾輪縮放。
- 縮放到達(dá)一定閾值后恢復(fù)網(wǎng)格大小。
- 窗口大小調(diào)整時(shí)網(wǎng)格背景也自動(dòng)調(diào)整重繪。
運(yùn)行結(jié)果
源碼
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(); // 設(shè)置窗口背景顏色 void drawRowLines(QPainter *painter); // 繪制橫線 void drawColLines(QPainter *painter); // 繪制豎線 private: int minGap; // 最小線間隔 int maxGap; // 最大線間隔 float gap; // 當(dāng)前線間隔 float startX; // 豎線初始x坐標(biāo)(從窗口中間開(kāi)始) float startY; // 橫線初始y坐標(biāo)(從窗口中間開(kāi)始) QPen lightPen; // 細(xì)一點(diǎn)的畫筆 QPen darkPen; // 粗一點(diǎn)的畫筆 }; #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; } // 每間隔一定數(shù)量的線,就畫一條粗一點(diǎn)的橫線 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; } // 每間隔一定數(shù)量的線,就畫一條粗一點(diǎn)的豎線 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實(shí)現(xiàn)繪制網(wǎng)格背景的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Qt繪制網(wǎng)格背景的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++多態(tài)特性之派生與虛函數(shù)與模板詳細(xì)介紹
這篇文章主要介紹了C++多態(tài)的特性派生與虛函數(shù)與模板,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-09-09虛函數(shù)表-C++多態(tài)的實(shí)現(xiàn)原理解析
這篇文章主要介紹了虛函數(shù)表-C++多態(tài)的實(shí)現(xiàn)原理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02淺談c++性能測(cè)試工具google benchmark
本文將會(huì)介紹如何使用模板以及參數(shù)生成器來(lái)批量生成測(cè)試用例,簡(jiǎn)化繁瑣的性能測(cè)試代碼2021-06-06C++ 實(shí)現(xiàn)線程安全的頻率限制器(推薦)
這篇文章主要介紹了在 C++ 中實(shí)現(xiàn)一個(gè)線程安全的頻率限制器,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05C++實(shí)現(xiàn)簡(jiǎn)易圖書館管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)易圖書館管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Qt5連接并操作PostgreSQL數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例
本文主要介紹了Qt5連接并操作PostgreSQL數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12詳解C++編程中的sizeof運(yùn)算符與typeid運(yùn)算符
這篇文章主要介紹了C++編程中的sizeof運(yùn)算符與typeid運(yùn)算符,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-01-01