#绘制各种图形 #弧形 #椭圆 #圆 #矩形 #多边形 #绘制图像
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import math
class DrawAll(QWidget):
def __init__(self):
super(DrawAll,self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('绘制各种图形')
self.resize(500,800)
def paintEvent(self, QPaintEvent):
painter = QPainter(self)
painter.begin(self)
painter.setPen(Qt.blue)
rect = QRect(0,10,100,100)
painter.drawArc(rect,0,50*16) #画弧
painter.setPen(Qt.red)
painter.drawArc(120,10,100,100,0,360*16) #画圆
painter.drawChord(0,120,100,100,0,50*16) #画弦 0-50度
painter.drawPie(120,120,100,100,15*16,130*16) #画扇形,右起15度到130度
painter.drawEllipse(10,240,150,100) #椭圆 10 240是左上角 ,150的宽度和100的高度
point1 = QPoint(140,380)
point2 = QPoint(270,420)
point3 = QPoint(290,512)
point4 = QPoint(290,588)
point5 = QPoint(200,533)
polygon = QPolygon([point1,point2,point3,point4,point5])
painter.drawPolygon(polygon) #多边形
image = QImage('./python.jpg')#装载图像 QImage
rect = QRect(10,600,image.width()/3,image.height()/3)
painter.drawImage(rect,image)
#画个表盘
painter.drawArc(300,100,100,100,0,360*16)
pointX = 350
pointY= 150
r = 50
for i in range(1,13):
x1 = pointX - math.cos(i*30/180*math.pi)*50
y1 = pointY - math.sin(i*30/180*math.pi)*50
x2 = pointX - math.cos(i * 30 / 180 * math.pi)*9/10*50
y2 = pointY - math.sin(i * 30 / 180 * math.pi)*9/10*50
painter.drawLine(x1,y1,x2,y2)
painter.end()
if __name__ == '__main__':
app = QApplication(sys.argv)
main = DrawAll()
main.show()
sys.exit(app.exec_())
#绘制直线
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import math
class DrawLines(QWidget):
def __init__(self):
super(DrawLines,self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('画直线')
self.resize(300,200)
def paintEvent(self, QPaintEvent):
painter = QPainter(self)
painter.begin(self)
pen = QPen(Qt.red,3,Qt.SolidLine)
painter.setPen(pen)
painter.drawLine(20,40,250,40)
pen.setStyle(Qt.DashLine)
painter.setPen(pen)
painter.drawLine(20,50,250,50)
pen.setStyle(Qt.DashDotDotLine)
painter.setPen(pen)
painter.drawLine(20, 60, 250, 60)
pen.setStyle(Qt.DotLine)
painter.setPen(pen)
painter.drawLine(20, 70, 250, 70)
pen.setStyle(Qt.CustomDashLine) #自定义线类型
pen.setDashPattern([1,4,8,4]) #分别代表 长度1 ,间隔1,长度2,间隔2,循环
painter.setPen(pen)
painter.drawLine(20, 80, 250, 80)
painter.end()
if __name__ == '__main__':
app = QApplication(sys.argv)
main = DrawLines()
main.show()
sys.exit(app.exec_())
#用像素点绘制正弦曲线
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import math
class DrawPoints(QWidget):
def __init__(self):
super(DrawPoints,self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('窗口上用像素点绘制正弦曲线')
self.resize(300,200)
def paintEvent(self, QPaintEvent):
painter = QPainter(self)
painter.begin(self)
size = self.size()
num =10000
for i in range(num):
x = (size.width()-100)/2.0+100.0*i/num #变量是i 用i 来表示x 和 y ,这里给他限定一个周期的正弦曲线占用100宽和100高的空间
y = size.height()/2.0-50*math.sin(math.pi*2.0*i/num)
painter.drawPoint(x,y)
painter.end()
if __name__ == '__main__':
app = QApplication(sys.argv)
main = DrawPoints()
main.show()
sys.exit(app.exec_())
#QPainter 绘制文字
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class QPainterDemo(QWidget):
def __init__(self):
super(QPainterDemo,self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('QPainter Demo')
self.resize(300,200)
self.text = 'hello world'
def paintEvent(self, event): #重写paintEvent方法 窗口改变,就会不断调用这个方法
painter = QPainter() #创建QPainter对象
painter.begin(self) #开始 加参数
painter.setPen(QColor(150,43,5)) #设置画笔
painter.setFont(QFont('Arial',20))#设置字体
painter.drawText(event.rect(),Qt.AlignCenter,self.text)
painter.end() #结束
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QPainterDemo()
main.show()
sys.exit(app.exec_())
#画刷QBrush
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class QBrushDemo(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('画刷演示QBrush')
self.resize(500,800)
def paintEvent(self, QPaintEvent):
painter = QPainter()
painter.begin(self)
brush = QBrush(Qt.SolidPattern)
painter.setBrush(brush)
painter.drawRect(10,20,150,120) #分别代表左上角横坐标,左上角纵坐标,宽度,高度
brush = QBrush(Qt.HorPattern)
painter.setBrush(brush)
painter.drawRect(180, 20, 150, 120)
brush = QBrush(Qt.Dense1Pattern)
painter.setBrush(brush)
painter.drawRect(10, 180, 150, 120)
brush = QBrush(Qt.Dense2Pattern)
painter.setBrush(brush)
painter.drawRect(180, 180, 150, 120)
painter.end()
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QBrushDemo()
main.show()
sys.exit(app.exec_())
#拖拽控件的实现
#A 控件拖拽到B控件
#A控件设置可拖拽A.setDrapEnabled(True),B控件设置接收拖拽 B.setAcceptDrops(True)
#B要响应2个事件:1、dragEnterEvent 将A拖到B触发 2、dropEvent 在B的区域放下A的时候触发
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class MyComboBox(QComboBox): #自定义控件
def __init__(self):
super().__init__()
self.setAcceptDrops(True)
def dragEnterEvent(self, QDragEnterEvent): #这里后面的参数好像可以随便命名
if QDragEnterEvent.mimeData().hasText(): #判断拿到的文本如果有内容就接收,否则拒绝
QDragEnterEvent.accept() #接受
else:QDragEnterEvent.ignore() #拒绝
def dropEvent(self, QDropEvent):
self.addItem(QDropEvent.mimeData().text()) #释放事件,处理数据
class DragWidgetDemo(QWidget): #主窗口类
def __init__(self):
super().__init__()
self.setWindowTitle('控件拖拽演示')
self.resize(200,100)
self.label = QLabel('请将文本框内容拖拽到下拉框')
self.lineEdit = QLineEdit()
self.lineEdit.setDragEnabled(True)
self.combobox = MyComboBox()
layout = QVBoxLayout(self)
layout.addWidget(self.label)
layout.addWidget(self.lineEdit)
layout.addWidget(self.combobox)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = DragWidgetDemo()
main.show()
sys.exit(app.exec_())
#使用剪贴板
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class ClipBoardDemo(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('剪贴板演示')
textCopyButton = QPushButton('复制文本')
textCopyButton.clicked.connect(self.textCopy)
textPasteButton = QPushButton('粘贴文本')
textPasteButton.clicked.connect(self.textPaste)
htmlCopyButton = QPushButton('复制html')
htmlCopyButton.clicked.connect(self.htmlCopy)
htmlPasteButton = QPushButton('粘贴html')
htmlPasteButton.clicked.connect(self.htmlPaste)
imageCopyButton = QPushButton('复制图片')
imageCopyButton.clicked.connect(self.imageCopy)
imagePasteButton = QPushButton('粘贴图片')
imagePasteButton.clicked.connect(self.imagePaste)
self.label = QLabel('label1')
self.imageLabel = QLabel()
# self.imageLabel.setPixmap(QPixmap('./favicon.ico'))
self.label1 = QLabel('hello')
self.textEdit = QTextEdit()
layout = QGridLayout(self)
layout.addWidget(textCopyButton,0,0)
layout.addWidget(imageCopyButton,0,1)
layout.addWidget(htmlCopyButton,0,2)
layout.addWidget(textPasteButton,1,0)
layout.addWidget(imagePasteButton,1,1)
layout.addWidget(htmlPasteButton,1,2)
layout.addWidget(self.label)
layout.addWidget(self.imageLabel)
layout.addWidget(self.label1)
layout.addWidget(self.textEdit)
def textCopy(self):
clipboard = QApplication.clipboard()#从QApplication中直接获取剪贴板
clipboard.setText('hello world')
def textPaste(self):
clipboard = QApplication.clipboard()
self.label1.setText(clipboard.text())
def imageCopy(self):
clipboard = QApplication.clipboard() # 从QApplication中直接获取剪贴板
clipboard.setPixmap(QPixmap('favicon.ico'))
def imagePaste(self):
clipboard = QApplication.clipboard()
self.imageLabel.setPixmap(clipboard.pixmap())
def htmlCopy(self):
mimedate = QMimeData() #QMimeData 存放数据
mimedate.setHtml('<a href="#">hello world</a>')
clipboard = QApplication.clipboard()
clipboard.setMimeData(mimedate)
def htmlPaste(self):
clipboard = QApplication.clipboard()
mimedata = clipboard.mimeData()
if mimedata.hasHtml():
self.textEdit.setText(mimedata.html())
if __name__ == '__main__':
app = QApplication(sys.argv)
main = ClipBoardDemo()
main.show()
sys.exit(app.exec_())