用PyQt实现透明桌面时钟小部件

#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Created on 2012-4-6
 
@author: wangxiao
'''
import sys
from PyQt4 import  QtGui, QtCore  
from PyQt4.QtCore import Qt
from PyQt4.QtCore import QPoint
from PyQt4.QtCore import QTimer
from PyQt4.QtCore import QTime 
from PyQt4.QtGui import QPainter
from PyQt4.QtGui import QColor 
from PyQt4.QtGui import QPolygon
from PyQt4.QtCore import SIGNAL as signal
class Clock(QtGui.QWidget):
    '''
    classdocs
    '''
 
 
    def __init__(self):
        '''
        Constructor
        '''
         
        super(Clock, self).__init__()  
         
        self.hourColor = QColor(127, 0, 127);
        self.minuteColor = QColor(0, 127, 127, 191)
        self.secondColor = QColor(127, 127, 0, 120)
        self.initUI()
        self.timer = QTimer()
        self.timer.timeout.connect(self.update)
        self.timer.start(30) 
        self.show() 
         
    def handChange(self):    
         
        self.side = min(self.width(), self.height())
        self.hand = (max(self.side / 200, 4), max(self.side / 100, 8), max(self.side / 40, 30))
        self.hourHand = QPolygon([QPoint(self.hand[0], self.hand[1]), QPoint(-self.hand[0], self.hand[1]), QPoint(0, -self.hand[2])])
        self.minuteHand = QPolygon([QPoint(self.hand[0], self.hand[1]), QPoint(-self.hand[0], self.hand[1]), QPoint(0, -self.hand[2] * 2)])
        self.secondHand = QPolygon([QPoint(self.hand[0], self.hand[1]), QPoint(-self.hand[0], self.hand[1]), QPoint(0, -self.hand[2] * 3)]) 
     
    def set_transparency(self, enabled):
        if enabled:
            self.setAutoFillBackground(False)
        else:
            self.setAttribute(Qt.WA_NoSystemBackground, False)
        # 下面这种方式好像不行
#        pal=QtGui.QPalette()
#        pal.setColor(QtGui.QPalette.Background, QColor(127, 127,10,120))
#        self.setPalette(pal) 
        self.setAttribute(Qt.WA_TranslucentBackground, enabled)
        self.repaint()
    
    def initUI(self):      
  
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Clock')
        self.handChange()
        self.rightButton = False
        # 下面两个配合实现窗体透明和置顶
        sizeGrip = QtGui.QSizeGrip(self)
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.SubWindow) 
        # self.setMouseTracking(True);
        self.trans = True
 
        self.set_transparency(True) 
 
        quitAction = QtGui.QAction(QtGui.QIcon('quit.png'), '&Quit', self)
        self.connect(quitAction, signal("triggered()"), QtGui.qApp.quit)
        backAction = QtGui.QAction('&Back', self)
        self.connect(backAction, signal("triggered()"), self.backClicked)
        self.popMenu = QtGui.QMenu() 
        self.popMenu.addAction(quitAction) 
        self.popMenu.addAction(backAction) 
   
         
    def resizeEvent(self, e):  
        self.handChange()
         
    def backClicked(self):
        if self.trans == True :
            self.trans = False 
            self.set_transparency(False)
        else: 
            self.trans = True
            self.set_transparency(True)
         
    def mouseReleaseEvent(self, e): 
        if self.rightButton == True:
            self.rightButton = False
            self.popMenu.popup(e.globalPos())
 
    def mouseMoveEvent(self, e):
        if e.buttons() & Qt.LeftButton:
            self.move(e.globalPos() - self.dragPos)
            e.accept()
    def mousePressEvent(self, e):
       
        if e.button() == Qt.LeftButton: 
            self.dragPos = e.globalPos() - self.frameGeometry().topLeft() 
            e.accept()
        if e.button() == Qt.RightButton and self.rightButton == False:
            self.rightButton = True
     
    def paintEvent(self, e): 
        time = QTime.currentTime() 
        qp = QPainter()
 
        qp.begin(self)
        # qp.setRenderHint(QPainter.Antialiasing)  # 开启这个抗锯齿,会很占cpu的!
        qp.translate(self.width() / 2, self.height() / 2) 
        qp.scale(self.side / 200.0, self.side / 200.0)
  
        qp.setPen(QtCore.Qt.NoPen)
        qp.setBrush(self.hourColor)
        qp.save()
        qp.rotate(30.0 * ((time.hour() + time.minute() / 60.0)))
        qp.drawConvexPolygon(self.hourHand)
        qp.restore()
         
        qp.setPen(self.hourColor)
        for i in range(12): 
            qp.drawLine(88, 0, 96, 0)
            qp.rotate(30.0) 
         
        qp.setPen(QtCore.Qt.NoPen)
        qp.setBrush(self.minuteColor)
        qp.save()
         
        qp.rotate(6.0 * ((time.minute() + (time.second() + time.msec() / 1000.0) / 60.0)))
        qp.drawConvexPolygon(self.minuteHand)
        qp.restore()
         
         
        qp.setPen(self.minuteColor)
        for i in range(60): 
            if (i % 5) is not 0:
                qp.drawLine(92, 0, 96, 0)
            qp.rotate(6.0) 
         
        qp.setPen(QtCore.Qt.NoPen)
        qp.setBrush(self.secondColor)
        qp.save()
        qp.rotate(6.0 * (time.second() + time.msec() / 1000.0))
        qp.drawConvexPolygon(self.secondHand)
        qp.restore() 
        qp.end() 
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    clock = Clock()
    sys.exit(app.exec_())

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ml

hdu----(2222)Keywords Search(trie树)

Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32...

33970
来自专栏JAVA烂猪皮

Dubbo性能调优参数及原理

其中,Constants.DEFAULT_QUEUES = 200。threads 参数配置的是业务处理线程池的最大(或核心)线程数。

34110
来自专栏计算机视觉与深度学习基础

Leetcode 174 Dungeon Game

The demons had captured the princess (P) and imprisoned her in the bottom-right...

22260
来自专栏懒人开发

dispatchTouchEvent事件分发浅析(七)requestDisallowInterceptTouchEvent

上一篇,我们大体理解了对应的ACTION_DOWN 之后 对应的ACTION_MOVE 和 ACTION_UP 的简单过程 当然,还分是否消费等

30510
来自专栏java初学

dubbo源码分析1——负载均衡

12340
来自专栏冷冷

【jfinal修仙系列】扩展CacheInterceptor支持Redis缓存

jfinal内置CacheInterceptor 依赖于EhCachePlugin,是基于ehcache的。 CacheInterceptor 可以将 acti...

22560
来自专栏C# 编程

C# 事件与委托

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 ...

20700
来自专栏ml

hdu----(3065)病毒侵袭持续中(AC自动机)

病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (J...

33940
来自专栏吴伟祥

EhCache缓存工具类 原

参考:https://blog.csdn.net/qq_34531925/article/details/79134903

16330
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

96360

扫码关注云+社区

领取腾讯云代金券