最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Qt中的雙緩沖機(jī)制與實(shí)例應(yīng)用

 更新時(shí)間:2023年03月11日 09:27:33   作者:音視頻開(kāi)發(fā)老舅  
所謂雙緩沖機(jī)制,是指在繪制控件時(shí),首先將要繪制的內(nèi)容繪制在一個(gè)圖片中,再將圖片一次性地繪制到控件上。本文主要為大家介紹了Qt中的雙緩沖機(jī)制與實(shí)例應(yīng)用,希望對(duì)大家有所幫助

1、雙緩沖機(jī)制

所謂雙緩沖機(jī)制,是指在繪制控件時(shí),首先將要繪制的內(nèi)容繪制在一個(gè)圖片中,再將圖片一次性地繪制到控件上。

在早期的Qt版本中,若直接在控件上進(jìn)行繪制工作,則在控件重繪時(shí)會(huì)產(chǎn)生閃爍的現(xiàn)象,控件重繪頻繁時(shí),閃爍尤為明顯。雙緩沖機(jī)制可以有效地消除這種閃爍現(xiàn)象。自 Qt 5 版本之后,QWidget 控件已經(jīng)能夠自動(dòng)處理閃爍的問(wèn)題。

因此,在控件上直接繪圖時(shí),不用再操心顯示的閃爍問(wèn)題,但雙緩沖機(jī)制在很多場(chǎng)合仍然有其用武之地。當(dāng)所需繪制的內(nèi)容較復(fù)雜并需要頻繁刷新,或者每次只需要刷新整個(gè)控件的一小部分時(shí),仍應(yīng)盡量采用雙緩沖機(jī)制。

2、實(shí)例效果圖

實(shí)現(xiàn)一個(gè)簡(jiǎn)單的繪圖工具,可以選擇線形,線寬,顏色等基本要素。效果圖如下所示:

3、實(shí)例核心代碼

PaintArea.h:

#ifndef PAINTAREA_H
#define PAINTAREA_H
 
#include <QWidget>
#include <QPen>
#include <QBrush>
#include <QMouseEvent>
#include <QPainter>
 
// 繪圖區(qū)域
class PaintArea : public QWidget
{
    Q_OBJECT
public:
    enum Shape{Dot, Line, Rectangle, RoundRect, Ellipse, Polygon, Polyline, Points, Arc, Path, Text, Pixmap};
    explicit PaintArea(QWidget *parent = nullptr);
    void setShape(Shape shape); // 設(shè)置形狀
    void setPen(QPen pen); // 設(shè)置畫(huà)筆
    void setBrush(QBrush brush); // 設(shè)置畫(huà)刷
    void clear(); // 清除繪圖區(qū)域
 
protected:
    void mousePressEvent(QMouseEvent *event); // 鼠標(biāo)點(diǎn)擊事件
    void mouseMoveEvent(QMouseEvent *event); // 鼠標(biāo)移動(dòng)事件
    void paintEvent(QPaintEvent *event); // 繪圖事件
 
private:
    Shape m_shape; // 形狀
    QPen m_pen; // 畫(huà)筆
    QBrush m_brush; // 畫(huà)刷
 
    QPixmap *m_pix; // 畫(huà)布
    QPoint m_posStart; // 鼠標(biāo)移動(dòng)繪圖的開(kāi)始坐標(biāo)
    QPoint m_posEnd; // 鼠標(biāo)移動(dòng)繪圖的結(jié)束坐標(biāo)
};
 
#endif // PAINTAREA_H

PaintArea.cpp:

#include "PaintArea.h"
 
PaintArea::PaintArea(QWidget *parent) :
    QWidget(parent)
{
    // 設(shè)置尺寸
    this->setMinimumSize(600, 300);
 
    // 用調(diào)色板設(shè)置背景色
    this->setPalette(QPalette(Qt::white));
    this->setAutoFillBackground(true);
 
    // 初始化畫(huà)布
    m_pix = new QPixmap(size()); // 此QPixmap對(duì)象用來(lái)準(zhǔn)備隨時(shí)接收繪制的內(nèi)容
    m_pix->fill(Qt::white); // 填充背景色為白色
}
 
// 鼠標(biāo)點(diǎn)擊事件
void PaintArea::mousePressEvent(QMouseEvent *event)
{
    m_posStart = event->pos();
}
 
// 鼠標(biāo)移動(dòng)事件
void PaintArea::mouseMoveEvent(QMouseEvent *event)
{
    QPainter *painter = new QPainter;
 
    // 鼠標(biāo)移動(dòng)繪圖在畫(huà)布pix上
    painter->begin(m_pix);
    painter->setPen(m_pen);
 
    if(m_shape == Dot)
        painter->drawLine(m_posStart, event->pos());
    else if(m_shape == Line)
        painter->drawLine(m_posStart, event->pos());
 
    painter->end();
 
    // 形狀為Dot時(shí),也就是自由繪圖模式時(shí),才時(shí)刻更新開(kāi)始點(diǎn)擊坐標(biāo)
    if(m_shape == Dot)
        m_posStart = event->pos();
 
    this->update();
}
 
// 繪圖事件
void PaintArea::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.drawPixmap(QPoint(0,0),*m_pix);
}
 
// 設(shè)置形狀
void PaintArea::setShape(Shape shape)
{
    m_shape = shape;
}
 
// 設(shè)置畫(huà)筆
void PaintArea::setPen(QPen pen)
{
    m_pen = pen;
}
 
// 設(shè)置畫(huà)刷
void PaintArea::setBrush(QBrush brush)
{
    m_brush = brush;
}
 
// 清除繪圖區(qū)域
void PaintArea::clear()
{
    QPixmap *clearPix  =new QPixmap(size());
    clearPix->fill(Qt::white);
    m_pix = clearPix;
    this->update();
}

4、雙緩沖具體實(shí)現(xiàn)代碼

下面是實(shí)現(xiàn)雙緩沖區(qū)域的地方:

PaintArea::PaintArea(QWidget *parent) :
    QWidget(parent)
{
    // 設(shè)置尺寸
    this->setMinimumSize(600, 300);
 
    // 用調(diào)色板設(shè)置背景色
    this->setPalette(QPalette(Qt::white));
    this->setAutoFillBackground(true);
 
    // 初始化畫(huà)布
    m_pix = new QPixmap(size()); // 此QPixmap對(duì)象用來(lái)準(zhǔn)備隨時(shí)接收繪制的內(nèi)容
    m_pix->fill(Qt::white); // 填充背景色為白色
}
 
// 鼠標(biāo)移動(dòng)事件
void PaintArea::mouseMoveEvent(QMouseEvent *event)
{
    QPainter *painter = new QPainter;
 
    // 鼠標(biāo)移動(dòng)繪圖在畫(huà)布pix上
    painter->begin(m_pix);
    painter->setPen(m_pen);
 
    if(m_shape == Dot)
        painter->drawLine(m_posStart, event->pos());
    else if(m_shape == Line)
        painter->drawLine(m_posStart, event->pos());
 
    painter->end();
 
    // 形狀為Dot時(shí),也就是自由繪圖模式時(shí),才時(shí)刻更新開(kāi)始點(diǎn)擊坐標(biāo)
    if(m_shape == Dot)
        m_posStart = event->pos();
 
    this->update();
}
 
// 繪圖事件
void PaintArea::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.drawPixmap(QPoint(0,0), *m_pix);
}

我們不是直接在面板上畫(huà)畫(huà),而且在 Pixmap 里面畫(huà)畫(huà),在這里,我們調(diào)用drawPixmap()函數(shù),將用于接收?qǐng)D形繪制的 QPixmap 對(duì)象繪制在繪制區(qū)窗體控件上,這樣就實(shí)現(xiàn)了雙緩沖機(jī)制。

到此這篇關(guān)于詳解Qt中的雙緩沖機(jī)制與實(shí)例應(yīng)用的文章就介紹到這了,更多相關(guān)Qt雙緩沖機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • Qt QFrame的具體使用

    Qt QFrame的具體使用

    本文主要介紹了Qt QFrame的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • C語(yǔ)言庫(kù)函數(shù)qsort的使用及模擬實(shí)現(xiàn)

    C語(yǔ)言庫(kù)函數(shù)qsort的使用及模擬實(shí)現(xiàn)

    這篇文章主要介紹了C語(yǔ)言庫(kù)函數(shù)qsort的使用及模擬實(shí)現(xiàn),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • 基于Qt實(shí)現(xiàn)駕??颇靠荚囅到y(tǒng)的示例代碼

    基于Qt實(shí)現(xiàn)駕??颇靠荚囅到y(tǒng)的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何基于Qt實(shí)現(xiàn)駕??颇靠荚囅到y(tǒng),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定幫助,需要的可以參考一下
    2022-07-07
  • c語(yǔ)言?xún)?nèi)存泄露示例解析

    c語(yǔ)言?xún)?nèi)存泄露示例解析

    從1988年著名的莫里斯蠕蟲(chóng) 攻擊到有關(guān) Flash Player 和其他關(guān)鍵的零售級(jí)程序的最新安全警報(bào)都與緩沖區(qū)溢出有關(guān):“大多數(shù)計(jì)算機(jī)安全漏洞都是緩沖區(qū)溢出”,Rodney Bates 在 2004 年寫(xiě)道
    2013-09-09
  • Trae+Qt+MSVC環(huán)境配置的實(shí)現(xiàn)示例

    Trae+Qt+MSVC環(huán)境配置的實(shí)現(xiàn)示例

    本文主要介紹了Trae+Qt+MSVC環(huán)境配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • Qt在vs2019中使用及設(shè)置方法

    Qt在vs2019中使用及設(shè)置方法

    這篇文章主要介紹了Qt在vs2019中使用及設(shè)置方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • C++ Opengl圖形顏色功能附源碼下載

    C++ Opengl圖形顏色功能附源碼下載

    這篇文章主要介紹了C++ Opengl圖形顏色功能附源碼下載,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 好用的C++ string Format“函數(shù)”介紹

    好用的C++ string Format“函數(shù)”介紹

    大家好,本篇文章主要講的是好用的C++ string Format“函數(shù)”介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 詳解C++設(shè)計(jì)模式編程中責(zé)任鏈模式的應(yīng)用

    詳解C++設(shè)計(jì)模式編程中責(zé)任鏈模式的應(yīng)用

    這篇文章主要介紹了C++設(shè)計(jì)模式編程中責(zé)任鏈模式的應(yīng)用,責(zé)任鏈模式使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系,需要的朋友可以參考下
    2016-03-03
  • C++實(shí)現(xiàn)LeetCode(140.拆分詞句之二)

    C++實(shí)現(xiàn)LeetCode(140.拆分詞句之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(140.拆分詞句之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評(píng)論

容城县| 延寿县| 邢台县| 普宁市| 文安县| 南通市| 青州市| 积石山| 海盐县| 如东县| 宁陵县| 阳江市| 安达市| 济源市| 分宜县| 克东县| 顺昌县| 丹东市| 宁强县| 施秉县| 河南省| 浠水县| 宝鸡市| 米易县| 铁岭县| 辽源市| 三原县| 额尔古纳市| 乌兰浩特市| 满城县| 贡觉县| 青冈县| 弥勒县| 巴彦县| 永平县| 怀仁县| 松潘县| 邮箱| 东兴市| 双辽市| 高安市|