#窗口控件的风格
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class WindowStyle(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('设置窗口控件风格')
layout = QHBoxLayout(self)
self.styleLabel = QLabel('设置窗口风格:')
self.styleCombobox = QComboBox()
self.styleCombobox.addItems(QStyleFactory.keys())
index = self.styleCombobox.findText(QApplication.style().objectName(),Qt.MatchFixedString)
self.styleCombobox.setCurrentIndex(index)
self.styleCombobox.activated[str].connect(self.handleStyleChanged)
layout.addWidget(self.styleLabel)
layout.addWidget(self.styleCombobox)
def handleStyleChanged(self,style):
QApplication.setStyle(style)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = WindowStyle()
main.show()
sys.exit(app.exec_())
#窗口样式,按钮实现窗口最大化和最小化
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class WindowStyle(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('设置窗口样式')
layout = QVBoxLayout(self)
self.styleLabel = QLabel('设置窗口样式:')
# self.setWindowFlags(Qt.WindowCloseButtonHint)
self.btn1 = QPushButton('最大化')
self.btn1.clicked.connect(self.maxWindow)
self.btn2 = QPushButton('最小化')
self.btn2.clicked.connect(self.showMinimized)
layout.addWidget(self.btn1)
layout.addWidget(self.btn2)
def maxWindow(self):
desktop = QApplication.desktop()
rect = desktop.availableGeometry()
self.setGeometry(rect)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = WindowStyle()
main.show()
sys.exit(app.exec_())
#窗口动态绘制曲线
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class DrawLine(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('鼠标绘图')
self.resize(400,400)
self.pix = QPixmap(400,400) #画布?
self.pix.fill(Qt.white)
self.startpoint = QPoint()
self.endpoint = QPoint()
def paintEvent(self,QPaintEvent): #窗口刷新或者装载时会自动调用这个事件 画图事件
painter = QPainter(self)
painter.drawLine(self.startpoint,self.endpoint)
self.startpoint = self.endpoint
pp = QPainter(self)
pp.drawPixmap(0,0,self.pix)
def mousePressEvent(self,event): #鼠标按下事件 设置开始点
if event.button() == Qt.LeftButton:
self.startpoint = event.pos()
def mouseMoveEvent(self,event): #鼠标按下并且移动
if event.buttons() and Qt.LeftButton:
self.endpoint = event.pos()
self.update()#窗口重新装载
def mouseReleaseEvent(self,event): #鼠标释放
if event.button() == Qt.LeftButton:
self.endpoint = event.pos()
self.update()
if __name__ == '__main__':
app = QApplication(sys.argv)
main = DrawLine()
main.show()
sys.exit(app.exec_())
#时钟 【直接整段代码运行试试看 】
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import math
import sys
class DrawLine(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('时钟')
self.resize(400,400)
self.hour = 0 #0点(12点) 对应的度数是 90°角,
self.minute = 59
self.second = 0
self.timer = QTimer() #设置时钟控件
self.timer.start(1000)
self.timer.timeout.connect(self.myTime) #在槽函数里实现秒针转动
def paintEvent(self,QPaintEvent): #窗口刷新或者装载时会自动调用这个事件 画图事件,画表盘,画表针,画刻度
self.painter = QPainter(self)
self.painter.begin(self)
height = self.geometry().height()
width = self.geometry().width()
if height>width:height = width #这里窗口的改变,长宽容易不对称,取最大的正方形,当成表盘的范围,
else:width = height
self.painter.drawArc(QRect(int(width/10),int(height/10),int(width*8/10),int(height*8/10)),0,360*16)
r = width*4/10 #半径
rx = width/2 #圆心
ry = height/2
#画圆心
pen = QPen(Qt.red,4,Qt.SolidLine)
self.painter.setPen(pen)
self.painter.drawPoint(int(rx), int(ry))
#画刻度
pen = QPen(Qt.blue,2,Qt.SolidLine)
self.painter.setPen(pen)
for i in range(0,12): #小时刻度 占半径的1/15
p1x = int(rx - r*math.cos(i*math.pi/6)) #圆上的点
p1y = int(ry - r*math.sin(i*math.pi/6))
p2x = int(rx - r * math.cos(i * math.pi / 6)*14/15) #圆内的点
p2y = int(ry - r * math.sin(i* math.pi / 6)*14/15)
p3x = int(rx - r * math.cos(i * math.pi / 6)*16/15) #圆外的点 以它为中心画一个矩形
p3y = int(ry - r * math.sin(i* math.pi / 6)*16/15)
self.painter.drawLine(p1x,p1y,p2x,p2y) #画刻度
str_hour = str(i-3) if i>3 else str(i+9)
self.painter.drawText(QRect(p3x-5,p3y-5,10,20),Qt.AlignCenter,str_hour) #小时文本
for i in range(1,61): #秒刻度 占半径的 1/60
if i%5!=0: #略过小时刻度
p1x = int(rx - r * math.cos(i * math.pi / 30))
p1y = int(ry - r * math.sin(i * math.pi / 30))
p2x = int(rx - r * math.cos(i * math.pi / 30) * 59 / 60)
p2y = int(ry - r * math.sin(i * math.pi / 30) * 59 / 60)
self.painter.drawLine(p1x, p1y, p2x, p2y)
#画秒针 占半径的12/15
degree_count = (15-self.second) if self.second <16 else 75-self.second #度数计数 (最后再乘以15度)
p2x = int(rx + r * math.cos(degree_count * math.pi / 30) * 12 / 15) #余弦是加
p2y = int(ry - r * math.sin(degree_count * math.pi / 30) * 12 / 15)
pen = QPen(Qt.green,2,Qt.SolidLine)
self.painter.setPen(pen)
self.painter.drawLine(int(rx), int(ry) , p2x, p2y)
# 画分针 占半径的9/15
degree_count = (15 - self.minute) if self.minute < 16 else 75 - self.minute # 度数计数 (最后再乘以15度)
p2x = int(rx + r * math.cos(degree_count * math.pi / 30) * 9 / 15)
p2y = int(ry - r * math.sin(degree_count * math.pi / 30) * 9 / 15)
pen = QPen(Qt.yellow, 2, Qt.SolidLine)
self.painter.setPen(pen)
self.painter.drawLine(int(rx), int(ry), p2x, p2y)
# 画时针 占半径的6/15 时针不能总在整点,也要按照分钟的比例改变指向
degree_count = (15 - self.hour) if self.hour < 16 else 75 - self.hour # 度数计数 (最后再乘以15度)
p2x = int(rx + r * math.cos(degree_count * math.pi / 6-math.pi*self.minute/360) * 6 / 15)
p2y = int(ry - r * math.sin(degree_count * math.pi / 6 -math.pi*self.minute/360) * 6 / 15)
pen = QPen(Qt.red, 3, Qt.SolidLine)
self.painter.setPen(pen)
self.painter.drawLine(int(rx), int(ry), p2x, p2y)
self.painter.end()
#在QTimer timeout事件里计算时分秒 频率是1s 相当于没1s更新一下整个窗口
def myTime(self):
self.second=self.second+1
if self.second == 60:
self.second=0
self.minute=self.minute+1
if self.minute == 60:
self.minute=0
self.hour=self.hour+1
if self.hour == 12:self.hour = 0
self.update()
if __name__ == '__main__':
app = QApplication(sys.argv)
main = DrawLine()
main.show()
sys.exit(app.exec_())