/
66_qpainter_aa.py
executable file
·139 lines (107 loc) · 4.07 KB
/
66_qpainter_aa.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#!/usr/bin/env python
# vim: set fileencoding=utf-8
import sys
import math
# import "jádra" frameworku Qt i modulu pro GUI
from PySide import QtCore
from PySide import QtGui
# funkce pro vykreslení úsečky zadanou barvou
def drawLine(qPainter, color, x1, y1, x2, y2, width=0):
# vytvoření pera a nastavení barvy kreslení
pen = QtGui.QPen(QtGui.QColor(*color))
# změna šířky pera
pen.setWidth(width)
# kreslit se bude právě vytvořeným perem
qPainter.setPen(pen)
# vykreslení úsečky
qPainter.drawLine(x1, y1, x2, y2)
# nový widget bude odvozen od obecného hlavního okna
class MainWindow(QtGui.QMainWindow):
# rozměry rastrového obrázku
IMAGE_WIDTH = 320
IMAGE_HEIGHT = 240
def __init__(self):
# zavoláme konstruktor předka
super(MainWindow, self).__init__()
self.prepareImage()
# konfigurace GUI + přidání widgetu do okna
self.prepareGUI()
def prepareImage(self):
# vytvoření instance třídy QImage
self.image = QtGui.QImage(
MainWindow.IMAGE_WIDTH, MainWindow.IMAGE_HEIGHT, QtGui.QImage.Format_RGB32
)
# vytvoření objektu typu QPainter s předáním
# reference na "pokreslovaný" objekt
qp = QtGui.QPainter(self.image)
qp.setRenderHint(QtGui.QPainter.Antialiasing)
# konstanty s n-ticemi představujícími základní barvy
BLACK = (0, 0, 0)
BLUE = (0, 0, 255)
CYAN = (0, 255, 255)
GREEN = (0, 255, 0)
YELLOW = (255, 255, 0)
RED = (255, 0, 0)
MAGENTA = (255, 0, 255)
WHITE = (255, 255, 255)
# Vykreslení čar různou barvou
drawLine(qp, BLUE, 10, 10, 160, 20)
drawLine(qp, CYAN, 10, 20, 160, 30)
drawLine(qp, GREEN, 10, 30, 160, 40)
drawLine(qp, YELLOW, 10, 40, 160, 50)
drawLine(qp, RED, 10, 50, 160, 60)
drawLine(qp, MAGENTA, 10, 60, 160, 70)
# Vykreslení čar s různým sklonem
for i in range(1, 90, 5):
# převod ze stupňů na radiány
angle = math.radians(i)
radius = 150
# výpočet koncových bodů úseček
x = radius * math.sin(math.radians(i))
y = radius * math.cos(math.radians(i))
# vykreslení jedné úsečky
drawLine(
qp, WHITE, MainWindow.IMAGE_WIDTH - 1, 0, MainWindow.IMAGE_WIDTH - x, y
)
# vykreslení čar různou šířkou
for i in range(1, 10):
drawLine(qp, WHITE, 10 + i * 15, 90, 20 + i * 15, 230, i)
# vytvoření instance třídy QPixmap z objektu QImage
self.pixmap = QtGui.QPixmap.fromImage(self.image)
def prepareGUI(self):
# velikost okna nezadávejte ručně - špatně se počítá kvůli toolbaru
# self.resize(256, 300)
self.setWindowTitle("QPainter")
# tlačítko Quit
quitAction = QtGui.QAction(
QtGui.QIcon("icons/application-exit.png"), "&Quit", self
)
quitAction.triggered.connect(self.close)
quitAction.setStatusTip("Quit the application")
quitAction.setShortcut("Ctrl+Q")
# nástrojový pruh
self.toolbar = self.addToolBar("title")
self.toolbar.setMovable(False)
# přidání tlačítka na nástrojový pruh
self.toolbar.addAction(quitAction)
# doprostřed okna přidáme návěští s rastrovým obrázkem
self.addLabelWithPixmap()
# zobrazení hlavního okna
self.show()
def addLabelWithPixmap(self):
# vytvoření návěští
label = QtGui.QLabel("test")
# přiřazení rastrového obrázku k návěští
label.setPixmap(self.pixmap)
# vložení návěští do hlavního okna
self.setCentralWidget(label)
def run(self, app):
# zobrazení okna na obrazovce
self.show()
# vstup do smyčky událostí (event loop)
app.exec_()
def main():
app = QtGui.QApplication(sys.argv)
MainWindow().run(app)
if __name__ == "__main__":
main()