国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Qt QWidget 抗鋸齒圓角窗口的一個實現(xiàn)方案(支持子控件)

這篇具有很好參考價值的文章主要介紹了Qt QWidget 抗鋸齒圓角窗口的一個實現(xiàn)方案(支持子控件)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

QWidget獨立窗口抗鋸齒圓角窗口的一個實現(xiàn)方案

由于 QWidget::setMask 接口設置圓角不支持抗鋸齒,所以通常會使用透明窗口加圓角背景,但圓角背景不能滿足對子控件的裁剪,子控件與圓角區(qū)域重疊的部分還是能顯示出來。當然對于大多數(shù)窗口,留出足夠的邊距也是可以接受。

對一些特殊場景,比如QComboBox的列表框,UI設計師強烈要求圓角,列表與它的容器不能有邊距,常規(guī)辦法就很難做到。筆者在經(jīng)過長時間的研究,有了一個可能的方案。

最終實現(xiàn)效果如下圖,可以看到,列表項區(qū)域,滾動條區(qū)域也能夠正常顯示圓角。
Qt QWidget 抗鋸齒圓角窗口的一個實現(xiàn)方案(支持子控件)

注意,該方案可能不適用一些場景:

  1. 特殊的平臺或Qt配置
  2. 復雜窗口且有性能要求
  3. 窗口尺寸較大(可以優(yōu)化)
  4. 有嵌入式窗口、OpenGL、QWindow等

方案

基本原理

Qt的每個獨立窗口,默認都是在一張圖片上,層疊繪制所有子控件。通常我們自繪控件時,幾乎不會使用QPainter::setCompositionMode設置其他混合模式,會出現(xiàn)比較奇怪的效果。但如果使用透明背景窗口,使用混合模式其實跟在QPixmap或QImage上繪制一樣。

另外一點,當一個控件重繪時,由于底層的繪制會影響到上層透明合成,所以Qt會從下到上按順序繪各個控件的臟區(qū)域。

所以理論上,如果在一個窗口上增加一個全尺寸的遮罩,重繪時使用混合模式就可以實現(xiàn)對一些像素的清除,且支持抗鋸齒。

代碼步驟

  1. 創(chuàng)建一個QWidget作為遮罩

    遮罩置于頂層,鼠標設置透傳(WA_TransparentForMouseEvents)

    遮罩跟隨窗口尺寸大小同步變化,保持一致。安裝事件過濾器即可(installEventFilter)

  2. 重寫paintEvent,利用混合模式清除圓角像素

    以下繪制邏輯比較直接,建議優(yōu)化

	//創(chuàng)建一個圖片,填充透明色
	QPixmap pix(this->size());
	pix.fill(QColor(0,0,0,0));
	// 在改圖片上填充一個圓角區(qū)域,需要設置抗鋸齒
	QPainter painter(&pix);
	painter.setRenderHint(QPainter::Antialiasing);
	QPainterPath path;
	//這里圓角區(qū)域需要根據(jù)dpi、size調(diào)整
	path.addRoundedRect(QRectF(pix.rect()).adjusted(0.5, 0.5, -0.5, -0.5), 10, 10); 
	painter.fillPath(path, Qt::white);
	painter.end();
	// 在窗口上繪制該圓角圖片
	painter.begin(this);
	painter.setRenderHint(QPainter::Antialiasing);
	// 該混合模式會根據(jù)source像素的透明度,調(diào)整目標的透明度
	painter.setCompositionMode(QPainter::CompositionMode_DestinationIn);
	painter.drawPixmap(0, 0, pix);
	// 恢復默認混合模式,繪制邊框,如果沒有則不用
	painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
	painter.setPen(QPen(QColor(0xCA64EA), 1.0));
	painter.drawPath(path);

優(yōu)化方向

  1. 性能優(yōu)化

    上面的示例,使用了一整張圖片對窗口像素進行混合模式的運算,且每次子控件重繪都會引起遮罩的重繪,性能比較差??梢钥紤]僅在四周設置圓角的遮罩。

  2. 圓角繪制優(yōu)化

    本文使用了一個不透明的圓角區(qū)域?qū)Υ翱谠O置裁剪,圓角的參數(shù)是固定在代碼里的。實際QSS是可以設置窗口的圓角,因此可以借助QSS來生成一張圓角圖片,就避免代碼里包含固定數(shù)值。

    具體實現(xiàn)原理可以參考之前的文章,這里不具體展示了:
    QComboBox文字居中的一種解決辦法
    Qt實現(xiàn)一個支持QSS的Switch Button
    Qt借助隱藏控件和QSS繪制重復元素文章來源地址http://www.zghlxwxcb.cn/news/detail-423736.html

到了這里,關(guān)于Qt QWidget 抗鋸齒圓角窗口的一個實現(xiàn)方案(支持子控件)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • ubuntu下 利用QT 實現(xiàn)嵌入另外一個程序到當前窗口

    查看當前應用窗口名稱

    2024年02月11日
    瀏覽(23)
  • 【QT】QWidget實現(xiàn)柱狀圖

    【QT】QWidget實現(xiàn)柱狀圖

    在名為 w_bar20auto1 的 QWidget 實現(xiàn)柱狀圖

    2024年02月02日
    瀏覽(27)
  • 如何用Qt實現(xiàn)一個無標題欄、半透明、置頂(懸浮)的窗口

    如何用Qt實現(xiàn)一個無標題欄、半透明、置頂(懸浮)的窗口

    在Qt框架中,要實現(xiàn)一個無標題欄、半透明、置頂(懸?。┑拇翱冢枰恍┨囟ǖ脑O置和技巧。廢話不多說,下面我將以DrawClient軟件為例,介紹一下實現(xiàn)這種效果的四個要點。 要點一:移除標題欄(去除關(guān)閉、最小化、最大化按鈕) 在窗口的構(gòu)造函數(shù)中設置窗口的樣式,

    2024年02月19日
    瀏覽(28)
  • Qt自定義窗口部件/控件(實現(xiàn)一個十六進制微調(diào)框SpinBox)

    Qt自定義窗口部件/控件(實現(xiàn)一個十六進制微調(diào)框SpinBox)

    在某些情況下,我們發(fā)現(xiàn)Qt窗口控件需要更多的自定義定制,這些定制可能要比它在Qt設計師里可設置的屬性或者對它調(diào)用的那些函數(shù)更多一些。一個簡單而直接的解決方法就是對相關(guān)的窗口部件類進行子類化并且使它能夠滿足我們的需要。 本文主要是通過實現(xiàn)一個十六進制微調(diào)

    2024年02月11日
    瀏覽(24)
  • 《QT從基礎到進階·三十六》QWidget實現(xiàn)收縮欄的效果

    《QT從基礎到進階·三十六》QWidget實現(xiàn)收縮欄的效果

    功能: 1、可以在收縮欄插件中添加界面 2、可以把界面展開或收縮 3、可以用鼠標拖動界面改變界面的排放順序 1、可以在收縮欄插件中添加界面 參數(shù)1:插入的界面指針 參數(shù)2:插入的界面標題 參數(shù)3:插入的界面圖標 demo: 在收縮欄插件中添加兩個界面 2、界面展開或收縮

    2024年02月05日
    瀏覽(36)
  • Unity 圓角矩形Shader實現(xiàn)(支持長方形)(只寫兩行)

    Unity 圓角矩形Shader實現(xiàn)(支持長方形)(只寫兩行)

    相信很多小伙伴都會遇到做 圓角矩形 的需求,網(wǎng)上的shader還不明白是怎么實現(xiàn)的,甚至還有一部分是錯誤的,本文講從原理到代碼講解 圓角矩形shader 的實現(xiàn) 想要實現(xiàn)一個圓角矩形,常見的是抽象成一個數(shù)學模型,如下圖紫色區(qū)域,就是我們應該保留的區(qū)域,為了更準確的

    2024年02月04日
    瀏覽(27)
  • 在ARM板上實現(xiàn)qt虛擬鍵盤 Qwidget實現(xiàn) 官方虛擬鍵盤、第三方虛擬鍵盤qtvirtualkeyboard //Qwidget最簡單但效果不是最好

    在ARM板上實現(xiàn)qt虛擬鍵盤 Qwidget實現(xiàn) 官方虛擬鍵盤、第三方虛擬鍵盤qtvirtualkeyboard //Qwidget最簡單但效果不是最好

    在使用qt的虛擬鍵盤以前,我的開發(fā)板qt環(huán)境中并沒有安裝虛擬鍵盤庫,所以這里還會順便介紹如何在開發(fā)板上已安裝qt環(huán)境的前提下,繼續(xù)更新qt的組件。 開發(fā)板qt版本:5.15.2 在這里,我默認你已經(jīng)有自己動手交叉編譯過qt源碼了,否則你將缺少部分細節(jié)和前置知識。首先在

    2024年04月09日
    瀏覽(333)
  • 已經(jīng)創(chuàng)建完成的QWidget窗口更改為QDialog窗口

    已經(jīng)創(chuàng)建完成的QWidget窗口更改為QDialog窗口

    描述:經(jīng)常性的創(chuàng)建窗口為QWidget,后期想做模態(tài)窗口QWidget明顯不如QDialog使用方便,所以做個窗口更改教程。 方法: 1.更改父類為QDialog 2. 使用notepad++打開ui文件 ?3.更改class為QDialog ?

    2024年02月09日
    瀏覽(17)
  • 【CSS】透明背景的圓角漸變邊框?qū)崿F(xiàn)方案

    【CSS】透明背景的圓角漸變邊框?qū)崿F(xiàn)方案

    css的漸變邊框可以用下面方式實現(xiàn) css的圓角邊框可以用下面方式實現(xiàn) 那想要實現(xiàn)一個圓角的漸變邊框呢,可能會以為,兩個都用上不就可以了,但事實是,這兩個屬性并不兼容,所以要實現(xiàn)一個圓角的漸變邊框,就得需要曲線救國的方法了 最終效果圖 ? ?

    2024年02月13日
    瀏覽(36)
  • FPGA基于XDMA實現(xiàn)PCIE X4通信方案 提供工程源碼和QT上位機程序和技術(shù)支持

    FPGA基于XDMA實現(xiàn)PCIE X4通信方案 提供工程源碼和QT上位機程序和技術(shù)支持

    PCIE(PCI Express)采用了目前業(yè)內(nèi)流行的點對點串行連接,比起 PCI 以及更早期的計算機總線的共享并行架構(gòu),每個設備都有自己的專用連接,不需要向整個總線請求帶寬,而且可以把數(shù)據(jù)傳輸率提高到一個很高的頻率,達到 PCI 所不能提供的高帶寬,是目前各行業(yè)高速接口的優(yōu)

    2023年04月24日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包