PyQt制造窗口陰影,想說(shuō)愛(ài)你不容易

這幾天沉迷Minecraft不能自拔奢驯,又快到了期末考碟摆,每次打開(kāi)啟動(dòng)器就有罪惡感。不過(guò)感覺(jué)這界面弄的不錯(cuò)叨橱,遲一點(diǎn)剛好要做一個(gè)桌面端的工具軟件典蜕,(這里吐槽electron.js生成的體積太大,做出來(lái)是方便罗洗,但用戶(hù)體驗(yàn)很差坝涮颉),于是就想研究一下這貨的UI怎么制作的伙菜,它用的應(yīng)該是Qt4

Mc啟動(dòng)器.png
DLL文件一覽.png

Python開(kāi)發(fā)速度還是很快的轩缤,所以打算用PyQt5進(jìn)行UI設(shè)計(jì)。

觀察這個(gè)程序贩绕,我們可以知道——

  1. 沒(méi)有用系統(tǒng)自帶的窗口欄
  2. 窗口邊緣處有陰影

因?yàn)橥耆珱](méi)有接觸過(guò)Qt火的,僅僅也只是聽(tīng)過(guò)。上搜索找了一些教程淑倾,完善的資料還是比較少的馏鹤,而且沒(méi)多少閱讀起來(lái)有爽爽的感覺(jué)。

但好歹先讓程序跑起來(lái)先娇哆。

網(wǎng)上教程還是有的湃累,這里就先不提Helloworld怎么跑起來(lái)的,或者你可以看下面的代碼碍讨。為了不跑題治力,這里先假設(shè)你已經(jīng)成功跑起來(lái)一個(gè)窗口。(為了舉例勃黍,我網(wǎng)上找的一個(gè)圖)

圖片來(lái)源于網(wǎng)絡(luò).png

去掉窗口

import sys

# 這里為了方便宵统,直接全部Import進(jìn)來(lái)
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class ExampleWindow(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # 去窗口邊框
        self.setWindowFlags(Qt.FramelessWindowHint)

if __name__ == '__main__':

    #sys.argv參數(shù)是一個(gè)來(lái)自命令行的參數(shù)列表。Python腳本可以在shell中運(yùn)行
    app = QApplication(sys.argv)

    w = ExampleWindow()
    sys.exit(app.exec_())

如無(wú)意外應(yīng)該就得到了:

無(wú)系統(tǒng)窗口欄的界面.png

但是呢覆获,這個(gè)時(shí)候窗口是無(wú)法拖動(dòng)的马澈,需要增加代碼:

    def mousePressEvent(self, event):
        if event.button()== Qt.LeftButton:
            self.m_drag=True
            self.m_DragPosition=event.globalPos()-self.pos()
            event.accept()

    def mouseMoveEvent(self, QMouseEvent):
        if QMouseEvent.buttons() and Qt.LeftButton:
            self.move(QMouseEvent.globalPos()-self.m_DragPosition)
            QMouseEvent.accept()

    def mouseReleaseEvent(self, QMouseEvent):
        self.m_drag=False

這里有一個(gè)Bug瓢省,就是在按鈕上面拖動(dòng)的時(shí)候就會(huì)產(chǎn)生位置偏差,待解決

制作窗口陰影

這里我查了一下PyQt5的API……箭券,可能是我眼拙净捅,沒(méi)有發(fā)現(xiàn)相關(guān)的API。不過(guò)辩块,在網(wǎng)上找到了一個(gè)博主的文章:

pyqt實(shí)現(xiàn)窗口邊框陰影效果(python)

里面的思路就是 ** 在窗口邊緣添加上半透明的陰影圖片(png) **
因?yàn)椴┲鳑](méi)有提供圖片(怨念)蛔六,所以,我只能自己用Ps切出來(lái)了废亭。

這里順帶想把想做的程序初步設(shè)計(jì)一下国章,方便切。然而在亂設(shè)計(jì)一通之后豆村,我還是選擇狗帶液兽,還是模板大法好,找個(gè)看的過(guò)去的模板來(lái)弄吧掌动。

(圖侵刪)

界面UI模板.png

然后給它加上投影

圖層.png

參數(shù)我是湊合湊合調(diào)的四啰,感覺(jué)還行

投影參數(shù).png

加上白色底圖看清楚一點(diǎn):

效果圖.png

這個(gè)時(shí)候,應(yīng)該使用切圖工具粗恢,對(duì)邊緣進(jìn)行切割柑晒,八張圖分別是四個(gè)角的圖,以及四條邊緣的圖眷射。


image.png

我切圖用的不熟匙赞,就強(qiáng)行用裁剪弄下來(lái)了。唯一要注意的是妖碉,要在整個(gè)圖像范圍中把一整個(gè)角弄下來(lái)涌庭,說(shuō)的好像有點(diǎn)難懂。上圖:

放大坐下角細(xì)節(jié)圖欧宜,應(yīng)該是

image.png

而不是

錯(cuò)誤示范.png

如果不弄好坐榆,到時(shí)候角就會(huì)顯得既不自然,很假很假

哎鱼鸠,又跑題了猛拴,扯回來(lái),把圖片剪下來(lái):

ShadowPNG.png

當(dāng)然蚀狰,這么蛋疼的事情,有人疼過(guò)了职员,后來(lái)人就還是別這樣折騰了麻蹋。 前人栽樹(shù),后人乘涼焊切,我把已經(jīng)扣好的圖放在這里了:

ShadowPNGs

添加代碼扮授,好吧芳室,我就是Ctrl+C、V之后發(fā)現(xiàn)這是PyQt4的 刹勃,報(bào)錯(cuò)堪侯,搜索之后發(fā)現(xiàn)** PyQt5是不存在 QStringList 和 QString的 ,直接用Python的 list 和 str 就好** (信息來(lái)源于stackoverflow_ImportError: cannot import name 'QStringList' in PyQt5

所以修改之后荔仁,能成功跑起來(lái)了:

def drawShadow(self,painter):
        #繪制左上角伍宦、左下角、右上角乏梁、右下角次洼、上、下遇骑、左卖毁、右邊框
        self.pixmaps=list()
        self.pixmaps.append(str("./img/shadow/left_top.png"))
        self.pixmaps.append(str("./img/shadow/left_bottom.png"))
        self.pixmaps.append(str("./img/shadow/right_top.png"))
        self.pixmaps.append(str("./img/shadow/right_bottom.png"))
        self.pixmaps.append(str("./img/shadow/top_mid.png"))
        self.pixmaps.append(str("./img/shadow/bottom_mid.png"))
        self.pixmaps.append(str("./img/shadow/left_mid.png"))
        self.pixmaps.append(str("./img/shadow/right_mid.png"))

        painter.drawPixmap(0, 0, self.SHADOW_WIDTH, self.SHADOW_WIDTH, QPixmap(self.pixmaps[0]))   #左上角
        painter.drawPixmap(self.width()-self.SHADOW_WIDTH, 0, self.SHADOW_WIDTH, self.SHADOW_WIDTH, QPixmap(self.pixmaps[2]))   #右上角
        painter.drawPixmap(0,self.height()-self.SHADOW_WIDTH, self.SHADOW_WIDTH, self.SHADOW_WIDTH, QPixmap(self.pixmaps[1]))   #左下角
        painter.drawPixmap(self.width()-self.SHADOW_WIDTH, self.height()-self.SHADOW_WIDTH, self.SHADOW_WIDTH, self.SHADOW_WIDTH, QPixmap(self.pixmaps[3]))  #右下角
        painter.drawPixmap(0, self.SHADOW_WIDTH, self.SHADOW_WIDTH, self.height()-2*self.SHADOW_WIDTH, QPixmap(self.pixmaps[6]).scaled(self.SHADOW_WIDTH, self.height()-2*self.SHADOW_WIDTH)) #左
        painter.drawPixmap(self.width()-self.SHADOW_WIDTH, self.SHADOW_WIDTH, self.SHADOW_WIDTH, self.height()-2*self.SHADOW_WIDTH, QPixmap(self.pixmaps[7]).scaled(self.SHADOW_WIDTH, self.height()- 2*self.SHADOW_WIDTH)) #右
        painter.drawPixmap(self.SHADOW_WIDTH, 0, self.width()-2*self.SHADOW_WIDTH, self.SHADOW_WIDTH, QPixmap(self.pixmaps[4]).scaled(self.width()-2*self.SHADOW_WIDTH, self.SHADOW_WIDTH)) #上
        painter.drawPixmap(self.SHADOW_WIDTH, self.height()-self.SHADOW_WIDTH, self.width()-2*self.SHADOW_WIDTH, self.SHADOW_WIDTH, QPixmap(self.pixmaps[5]).scaled(self.width()-2*self.SHADOW_WIDTH, self.SHADOW_WIDTH))   #下

    def paintEvent(self, event):
        painter = QPainter(self)
        self.drawShadow(painter)
        painter.setPen(Qt.NoPen)
        painter.setBrush(Qt.white)
        painter.drawRect(QRect(self.SHADOW_WIDTH, self.SHADOW_WIDTH, self.width()-2*self.SHADOW_WIDTH, self.height()-2*self.SHADOW_WIDTH))

記得還要加上窗口背景透明:

def initUI(self):
    ...
    self.setAttribute(Qt.WA_TranslucentBackground)

然后運(yùn)行就有

最終效果圖.png

來(lái)一張對(duì)比,大致效果差不多

image.png

然后再添加一些

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末落萎,一起剝皮案震驚了整個(gè)濱河市亥啦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌练链,老刑警劉巖翔脱,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異兑宇,居然都是意外死亡碍侦,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)隶糕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瓷产,“玉大人,你說(shuō)我怎么就攤上這事枚驻”舻” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵再登,是天一觀的道長(zhǎng)尔邓。 經(jīng)常有香客問(wèn)我,道長(zhǎng)锉矢,這世上最難降的妖魔是什么梯嗽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮沽损,結(jié)果婚禮上灯节,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好炎疆,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布卡骂。 她就那樣靜靜地躺著,像睡著了一般形入。 火紅的嫁衣襯著肌膚如雪全跨。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天亿遂,我揣著相機(jī)與錄音浓若,去河邊找鬼。 笑死崩掘,一個(gè)胖子當(dāng)著我的面吹牛七嫌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播苞慢,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼诵原,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了挽放?” 一聲冷哼從身側(cè)響起绍赛,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辑畦,沒(méi)想到半個(gè)月后吗蚌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纯出,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年蚯妇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片暂筝。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡箩言,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出焕襟,到底是詐尸還是另有隱情陨收,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布鸵赖,位于F島的核電站务漩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏它褪。R本人自食惡果不足惜饵骨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茫打。 院中可真熱鬧宏悦,春花似錦镐确、人聲如沸包吝。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)诗越。三九已至砖瞧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嚷狞,已是汗流浹背块促。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留床未,地道東北人竭翠。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像薇搁,于是被迫代替她去往敵國(guó)和親斋扰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,307評(píng)論 25 707
  • 成長(zhǎng)會(huì)痛啃洋,誰(shuí)也無(wú)法避免传货,當(dāng)你在這條道路上摸索的時(shí)候,難免會(huì)遇到一些迷茫宏娄,也不常有一些奇怪的思想问裕。這不是瘋狂...
    洋仔Fly閱讀 196評(píng)論 0 1
  • 這樣的畫(huà)很多人都見(jiàn)過(guò)了,這是我曾經(jīng)的作業(yè)孵坚,我對(duì)這種密密麻麻的線條還不是很熟粮宛,不過(guò)還好,有很多小伙伴在群里都堅(jiān)持著練...
    w小樹(shù)芽閱讀 208評(píng)論 0 2
  • HashMap中存儲(chǔ)了指向LinkedList的指針卖宠,這樣就可以保證在O(1)的訪問(wèn)復(fù)雜度巍杈。 referenceL...
    HenryTien閱讀 729評(píng)論 0 0
  • 肥胖是指一定程度的明顯超重與脂肪層過(guò)厚,是體內(nèi)脂肪逗堵,尤其是甘油三酯積聚過(guò)多而導(dǎo)致的一種狀態(tài)秉氧。由于食物攝入過(guò)多或機(jī)體...
    RonaldMcDonald閱讀 377評(píng)論 0 2