t6.py¶
# PySide6 tutorial 6
import sys
from PySide6 import QtCore, QtGui, QtWidgets
class LCDRange(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
lcd = QtWidgets.QLCDNumber(2)
slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
slider.setRange(0, 99)
slider.setValue(0)
self.connect(slider, QtCore.SIGNAL("valueChanged(int)"),
lcd, QtCore.SLOT("display(int)"))
layout = QtWidgets.QVBoxLayout()
layout.addWidget(lcd)
layout.addWidget(slider)
self.setLayout(layout)
class MyWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
quit = QtWidgets.QPushButton("Quit")
quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
self.connect(quit, QtCore.SIGNAL("clicked()"),
qApp, QtCore.SLOT("quit()"))
grid = QtWidgets.QGridLayout()
layout = QtWidgets.QVBoxLayout()
layout.addWidget(quit)
layout.addLayout(grid)
self.setLayout(layout)
for row in range(3):
for column in range(3):
grid.addWidget(LCDRange(), row, column)
app = QtWidgets.QApplication(sys.argv)
widget = MyWidget()
widget.show()
sys.exit(app.exec_())
t9.py¶
# PySide6 tutorial 9
import sys
from PySide6 import QtCore, QtGui, QtWidgets
class LCDRange(QtWidgets.QWidget):
valueChanged = QtCore.Signal(int)
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
lcd = QtWidgets.QLCDNumber(2)
self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
self.slider.setRange(0, 99)
self.slider.setValue(0)
self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
lcd, QtCore.SLOT("display(int)"))
self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
self, QtCore.SIGNAL("valueChanged(int)"))
layout = QtWidgets.QVBoxLayout()
layout.addWidget(lcd)
layout.addWidget(self.slider)
self.setLayout(layout)
self.setFocusProxy(self.slider)
def value(self):
return self.slider.value()
@QtCore.Slot(int)
def setValue(self, value):
self.slider.setValue(value)
def setRange(self, minValue, maxValue):
if minValue < 0 or maxValue > 99 or minValue > maxValue:
QtCore.qWarning("LCDRange::setRange(%d, %d)\n"
"\tRange must be 0..99\n"
"\tand minValue must not be greater than maxValue" % (minValue, maxValue))
return
self.slider.setRange(minValue, maxValue)
class CannonField(QtWidgets.QWidget):
angleChanged = QtCore.Signal(int)
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.currentAngle = 45
self.setPalette(QtGui.QPalette(QtGui.QColor(250, 250, 200)))
self.setAutoFillBackground(True)
def angle(self):
return self.currentAngle
@QtCore.Slot(int)
def setAngle(self, angle):
if angle < 5:
angle = 5
if angle > 70:
angle = 70
if self.currentAngle == angle:
return
self.currentAngle = angle
self.update()
self.emit(QtCore.SIGNAL("angleChanged(int)"), self.currentAngle)
def paintEvent(self, event):
painter = QtGui.QPainter(self)
painter.setPen(QtCore.Qt.NoPen)
painter.setBrush(QtCore.Qt.blue)
painter.translate(0, self.rect().height())
painter.drawPie(QtCore.QRect(-35, -35, 70, 70), 0, 90 * 16)
painter.rotate(-self.currentAngle)
painter.drawRect(QtCore.QRect(33, -4, 15, 8))
class MyWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
quit = QtWidgets.QPushButton("Quit")
quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
self.connect(quit, QtCore.SIGNAL("clicked()"),
qApp, QtCore.SLOT("quit()"))
angle = LCDRange()
angle.setRange(5, 70)
cannonField = CannonField()
self.connect(angle, QtCore.SIGNAL("valueChanged(int)"),
cannonField.setAngle)
self.connect(cannonField, QtCore.SIGNAL("angleChanged(int)"),
angle.setValue)
gridLayout = QtWidgets.QGridLayout()
gridLayout.addWidget(quit, 0, 0)
gridLayout.addWidget(angle, 1, 0)
gridLayout.addWidget(cannonField, 1, 1, 2, 1)
gridLayout.setColumnStretch(1, 10)
self.setLayout(gridLayout)
angle.setValue(60)
angle.setFocus()
app = QtWidgets.QApplication(sys.argv)
widget = MyWidget()
widget.setGeometry(100, 100, 500, 355)
widget.show()
sys.exit(app.exec_())
t8.py¶
# PySide6 tutorial 8
import sys
from PySide6 import QtCore, QtGui, QtWidgets
class LCDRange(QtWidgets.QWidget):
valueChanged = QtCore.Signal(int)
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
lcd = QtWidgets.QLCDNumber(2)
self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
self.slider.setRange(0, 99)
self.slider.setValue(0)
self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
lcd, QtCore.SLOT("display(int)"))
self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
self, QtCore.SIGNAL("valueChanged(int)"))
layout = QtWidgets.QVBoxLayout()
layout.addWidget(lcd)
layout.addWidget(self.slider)
self.setLayout(layout)
self.setFocusProxy(self.slider)
def value(self):
return self.slider.value()
@QtCore.Slot(int)
def setValue(self, value):
self.slider.setValue(value)
def setRange(self, minValue, maxValue):
if minValue < 0 or maxValue > 99 or minValue > maxValue:
QtCore.qWarning("LCDRange.setRange(%d, %d)\n"
"\tRange must be 0..99\n"
"\tand minValue must not be greater than maxValue" % (minValue, maxValue))
return
self.slider.setRange(minValue, maxValue)
class CannonField(QtWidgets.QWidget):
angleChanged = QtCore.Signal(int)
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.currentAngle = 45
self.setPalette(QtGui.QPalette(QtGui.QColor(250, 250, 200)))
self.setAutoFillBackground(True)
def angle(self):
return self.currentAngle
@QtCore.Slot(int)
def setAngle(self, angle):
if angle < 5:
angle = 5
if angle > 70:
angle = 70
if self.currentAngle == angle:
return
self.currentAngle = angle
self.update()
self.emit(QtCore.SIGNAL("angleChanged(int)"), self.currentAngle)
def paintEvent(self, event):
painter = QtGui.QPainter(self)
painter.drawText(200, 200, "Angle = %d" % self.currentAngle)
class MyWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
quit = QtWidgets.QPushButton("Quit")
quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
self.connect(quit, QtCore.SIGNAL("clicked()"),
qApp, QtCore.SLOT("quit()"))
angle = LCDRange()
angle.setRange(5, 70)
cannonField = CannonField()
self.connect(angle, QtCore.SIGNAL("valueChanged(int)"),
cannonField.setAngle)
self.connect(cannonField, QtCore.SIGNAL("angleChanged(int)"),
angle.setValue)
gridLayout = QtWidgets.QGridLayout()
gridLayout.addWidget(quit, 0, 0)
gridLayout.addWidget(angle, 1, 0)
gridLayout.addWidget(cannonField, 1, 1, 2, 1)
gridLayout.setColumnStretch(1, 10)
self.setLayout(gridLayout)
angle.setValue(60)
angle.setFocus()
app = QtWidgets.QApplication(sys.argv)
widget = MyWidget()
widget.setGeometry(100, 100, 500, 355)
widget.show()
sys.exit(app.exec_())
t13.py¶
# PySide6 tutorial 13
import sys
import math
import random
from PySide6 import QtCore, QtGui, QtWidgets
class LCDRange(QtWidgets.QWidget):
valueChanged = QtCore.Signal(int)
def __init__(self, text=None, parent=None):
if isinstance(text, QtWidgets.QWidget):
parent = text
text = None
QtWidgets.QWidget.__init__(self, parent)
self.init()
if text:
self.setText(text)
def init(self):
lcd = QtWidgets.QLCDNumber(2)
self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
self.slider.setRange(0, 99)
self.slider.setValue(0)
self.label = QtWidgets.QLabel()
self.label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop)
self.label.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
lcd, QtCore.SLOT("display(int)"))
self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
self, QtCore.SIGNAL("valueChanged(int)"))
layout = QtWidgets.QVBoxLayout()
layout.addWidget(lcd)
layout.addWidget(self.slider)
layout.addWidget(self.label)
self.setLayout(layout)
self.setFocusProxy(self.slider)
def value(self):
return self.slider.value()
@QtCore.Slot(int)
def setValue(self, value):
self.slider.setValue(value)
def text(self):
return self.label.text()
def setRange(self, minValue, maxValue):
if minValue < 0 or maxValue > 99 or minValue > maxValue:
QtCore.qWarning("LCDRange::setRange(%d, %d)\n"
"\tRange must be 0..99\n"
"\tand minValue must not be greater than maxValue" % (minValue, maxValue))
return
self.slider.setRange(minValue, maxValue)
def setText(self, text):
self.label.setText(text)
class CannonField(QtWidgets.QWidget):
angleChanged = QtCore.Signal(int)
forceChanged = QtCore.Signal(int)
hit = QtCore.Signal()
missed = QtCore.Signal()
canShoot = QtCore.Signal(bool)
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.currentAngle = 45
self.currentForce = 0
self.timerCount = 0
self.autoShootTimer = QtCore.QTimer(self)
self.connect(self.autoShootTimer, QtCore.SIGNAL("timeout()"),
self.moveShot)
self.shootAngle = 0
self.shootForce = 0
self.target = QtCore.QPoint(0, 0)
self.gameEnded = False
self.setPalette(QtGui.QPalette(QtGui.QColor(250, 250, 200)))
self.setAutoFillBackground(True)
self.newTarget()
def angle(self):
return self.currentAngle
@QtCore.Slot(int)
def setAngle(self, angle):
if angle < 5:
angle = 5
if angle > 70:
angle = 70
if self.currentAngle == angle:
return
self.currentAngle = angle
self.update()
self.emit(QtCore.SIGNAL("angleChanged(int)"), self.currentAngle)
def force(self):
return self.currentForce
@QtCore.Slot(int)
def setForce(self, force):
if force < 0:
force = 0
if self.currentForce == force:
return
self.currentForce = force
self.emit(QtCore.SIGNAL("forceChanged(int)"), self.currentForce)
@QtCore.Slot()
def shoot(self):
if self.isShooting():
return
self.timerCount = 0
self.shootAngle = self.currentAngle
self.shootForce = self.currentForce
self.autoShootTimer.start(5)
self.emit(QtCore.SIGNAL("canShoot(bool)"), False)
firstTime = True
def newTarget(self):
if CannonField.firstTime:
CannonField.firstTime = False
midnight = QtCore.QTime(0, 0, 0)
random.seed(midnight.secsTo(QtCore.QTime.currentTime()))
self.target = QtCore.QPoint(200 + random.randint(0, 190 - 1), 10 + random.randint(0, 255 - 1))
self.update()
def setGameOver(self):
if self.gameEnded:
return
if self.isShooting():
self.autoShootTimer.stop()
self.gameEnded = True
self.update()
def restartGame(self):
if self.isShooting():
self.autoShootTimer.stop()
self.gameEnded = False
self.update()
self.emit(QtCore.SIGNAL("canShoot(bool)"), True)
@QtCore.Slot()
def moveShot(self):
region = QtGui.QRegion(self.shotRect())
self.timerCount += 1
shotR = self.shotRect()
if shotR.intersects(self.targetRect()):
self.autoShootTimer.stop()
self.emit(QtCore.SIGNAL("hit()"))
self.emit(QtCore.SIGNAL("canShoot(bool)"), True)
elif shotR.x() > self.width() or shotR.y() > self.height():
self.autoShootTimer.stop()
self.emit(QtCore.SIGNAL("missed()"))
self.emit(QtCore.SIGNAL("canShoot(bool)"), True)
else:
region = region.united(QtGui.QRegion(shotR))
self.update(region)
def paintEvent(self, event):
painter = QtGui.QPainter(self)
if self.gameEnded:
painter.setPen(QtCore.Qt.black)
painter.setFont(QtGui.QFont("Courier", 48, QtGui.QFont.Bold))
painter.drawText(self.rect(), QtCore.Qt.AlignCenter, "Game Over")
self.paintCannon(painter)
if self.isShooting():
self.paintShot(painter)
if not self.gameEnded:
self.paintTarget(painter)
def paintShot(self, painter):
painter.setPen(QtCore.Qt.NoPen)
painter.setBrush(QtCore.Qt.black)
painter.drawRect(self.shotRect())
def paintTarget(self, painter):
painter.setPen(QtCore.Qt.black)
painter.setBrush(QtCore.Qt.red)
painter.drawRect(self.targetRect())
barrelRect = QtCore.QRect(33, -4, 15, 8)
def paintCannon(self, painter):
painter.setPen(QtCore.Qt.NoPen)
painter.setBrush(QtCore.Qt.blue)
painter.save()
painter.translate(0, self.height())
painter.drawPie(QtCore.QRect(-35, -35, 70, 70), 0, 90 * 16)
painter.rotate(-self.currentAngle)
painter.drawRect(CannonField.barrelRect)
painter.restore()
def cannonRect(self):
result = QtCore.QRect(0, 0, 50, 50)
result.moveBottomLeft(self.rect().bottomLect())
return result
def shotRect(self):
gravity = 4.0
time = self.timerCount / 40.0
velocity = self.shootForce
radians = self.shootAngle * 3.14159265 / 180
velx = velocity * math.cos(radians)
vely = velocity * math.sin(radians)
x0 = (CannonField.barrelRect.right() + 5) * math.cos(radians)
y0 = (CannonField.barrelRect.right() + 5) * math.sin(radians)
x = x0 + velx * time
y = y0 + vely * time - 0.5 * gravity * time * time
result = QtCore.QRect(0, 0, 6, 6)
result.moveCenter(QtCore.QPoint(round(x), self.height() - 1 - round(y)))
return result
def targetRect(self):
result = QtCore.QRect(0, 0, 20, 10)
result.moveCenter(QtCore.QPoint(self.target.x(), self.height() - 1 - self.target.y()))
return result
def gameOver(self):
return self.gameEnded
def isShooting(self):
return self.autoShootTimer.isActive()
class GameBoard(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
quit = QtWidgets.QPushButton("&Quit")
quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
self.connect(quit, QtCore.SIGNAL("clicked()"),
qApp, QtCore.SLOT("quit()"))
angle = LCDRange("ANGLE")
angle.setRange(5, 70)
force = LCDRange("FORCE")
force.setRange(10, 50)
self.cannonField = CannonField()
self.connect(angle, QtCore.SIGNAL("valueChanged(int)"),
self.cannonField.setAngle)
self.connect(self.cannonField, QtCore.SIGNAL("angleChanged(int)"),
angle.setValue)
self.connect(force, QtCore.SIGNAL("valueChanged(int)"),
self.cannonField.setForce)
self.connect(self.cannonField, QtCore.SIGNAL("forceChanged(int)"),
force.setValue)
self.connect(self.cannonField, QtCore.SIGNAL("hit()"), self.hit)
self.connect(self.cannonField, QtCore.SIGNAL("missed()"), self.missed)
shoot = QtWidgets.QPushButton("&Shoot")
shoot.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
self.connect(shoot, QtCore.SIGNAL("clicked()"), self.fire)
self.connect(self.cannonField, QtCore.SIGNAL("canShoot(bool)"),
shoot, QtCore.SLOT("setEnabled(bool)"))
restart = QtWidgets.QPushButton("&New Game")
restart.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
self.connect(restart, QtCore.SIGNAL("clicked()"), self.newGame)
self.hits = QtWidgets.QLCDNumber(2)
self.shotsLeft = QtWidgets.QLCDNumber(2)
hitsLabel = QtWidgets.QLabel("HITS")
shotsLeftLabel = QtWidgets.QLabel("SHOTS LEFT")
topLayout = QtWidgets.QHBoxLayout()
topLayout.addWidget(shoot)
topLayout.addWidget(self.hits)
topLayout.addWidget(hitsLabel)
topLayout.addWidget(self.shotsLeft)
topLayout.addWidget(shotsLeftLabel)
topLayout.addStretch(1)
topLayout.addWidget(restart)
leftLayout = QtWidgets.QVBoxLayout()
leftLayout.addWidget(angle)
leftLayout.addWidget(force)
gridLayout = QtWidgets.QGridLayout()
gridLayout.addWidget(quit, 0, 0)
gridLayout.addLayout(topLayout, 0, 1)
gridLayout.addLayout(leftLayout, 1, 0)
gridLayout.addWidget(self.cannonField, 1, 1, 2, 1)
gridLayout.setColumnStretch(1, 10)
self.setLayout(gridLayout)
angle.setValue(60)
force.setValue(25)
angle.setFocus()
self.newGame()
@QtCore.Slot()
def fire(self):
if self.cannonField.gameOver() or self.cannonField.isShooting():
return
self.shotsLeft.display(self.shotsLeft.intValue() - 1)
self.cannonField.shoot()
@QtCore.Slot()
def hit(self):
self.hits.display(self.hits.intValue() + 1)
if self.shotsLeft.intValue() == 0:
self.cannonField.setGameOver()
else:
self.cannonField.newTarget()
@QtCore.Slot()
def missed(self):
if self.shotsLeft.intValue() == 0:
self.cannonField.setGameOver()
@QtCore.Slot()
def newGame(self):
self.shotsLeft.display(15)
self.hits.display(0)
self.cannonField.restartGame()
self.cannonField.newTarget()
app = QtWidgets.QApplication(sys.argv)
board = GameBoard()
board.setGeometry(100, 100, 500, 355)
board.show()
sys.exit(app.exec_())
t10.py¶
# PySide6 tutorial 10
import sys
from PySide6 import QtCore, QtGui, QtWidgets
class LCDRange(QtWidgets.QWidget):
valueChanged = QtCore.Signal(int)
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
lcd = QtWidgets.QLCDNumber(2)
self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
self.slider.setRange(0, 99)
self.slider.setValue(0)
self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
lcd, QtCore.SLOT("display(int)"))
self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
self, QtCore.SIGNAL("valueChanged(int)"))
layout = QtWidgets.QVBoxLayout()
layout.addWidget(lcd)
layout.addWidget(self.slider)
self.setLayout(layout)
self.setFocusProxy(self.slider)
def value(self):
return self.slider.value()
@QtCore.Slot(int)
def setValue(self, value):
self.slider.setValue(value)
def setRange(self, minValue, maxValue):
if minValue < 0 or maxValue > 99 or minValue > maxValue:
QtCore.qWarning("LCDRange::setRange(%d, %d)\n"
"\tRange must be 0..99\n"
"\tand minValue must not be greater than maxValue" % (minValue, maxValue))
return
self.slider.setRange(minValue, maxValue)
class CannonField(QtWidgets.QWidget):
angleChanged = QtCore.Signal(int)
forceChanged = QtCore.Signal(int)
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.currentAngle = 45
self.currentForce = 0
self.setPalette(QtGui.QPalette(QtGui.QColor(250, 250, 200)))
self.setAutoFillBackground(True)
def angle(self):
return self.currentAngle
@QtCore.Slot(int)
def setAngle(self, angle):
if angle < 5:
angle = 5
if angle > 70:
angle = 70
if self.currentAngle == angle:
return
self.currentAngle = angle
self.update()
self.emit(QtCore.SIGNAL("angleChanged(int)"), self.currentAngle)
def force(self):
return self.currentForce
@QtCore.Slot(int)
def setForce(self, force):
if force < 0:
force = 0
if self.currentForce == force:
return
self.currentForce = force
self.emit(QtCore.SIGNAL("forceChanged(int)"), self.currentForce)
def paintEvent(self, event):
painter = QtGui.QPainter(self)
painter.setPen(QtCore.Qt.NoPen)
painter.setBrush(QtCore.Qt.blue)
painter.translate(0, self.height())
painter.drawPie(QtCore.QRect(-35, -35, 70, 70), 0, 90 * 16)
painter.rotate(-self.currentAngle)
painter.drawRect(QtCore.QRect(33, -4, 15, 8))
def cannonRect(self):
result = QtCore.QRect(0, 0, 50, 50)
result.moveBottomLeft(self.rect().bottomLect())
return result
class MyWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
quit = QtWidgets.QPushButton("&Quit")
quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
self.connect(quit, QtCore.SIGNAL("clicked()"),
qApp, QtCore.SLOT("quit()"))
angle = LCDRange()
angle.setRange(5, 70)
force = LCDRange()
force.setRange(10, 50)
cannonField = CannonField()
self.connect(angle, QtCore.SIGNAL("valueChanged(int)"),
cannonField.setAngle)
self.connect(cannonField, QtCore.SIGNAL("angleChanged(int)"),
angle.setValue)
self.connect(force, QtCore.SIGNAL("valueChanged(int)"),
cannonField.setForce)
self.connect(cannonField, QtCore.SIGNAL("forceChanged(int)"),
force.setValue)
leftLayout = QtWidgets.QVBoxLayout()
leftLayout.addWidget(angle)
leftLayout.addWidget(force)
gridLayout = QtWidgets.QGridLayout()
gridLayout.addWidget(quit, 0, 0)
gridLayout.addLayout(leftLayout, 1, 0)
gridLayout.addWidget(cannonField, 1, 1, 2, 1)
gridLayout.setColumnStretch(1, 10)
self.setLayout(gridLayout)
angle.setValue(60)
force.setValue(25)
angle.setFocus()
app = QtWidgets.QApplication(sys.argv)
widget = MyWidget()
widget.setGeometry(100, 100, 500, 355)
widget.show()
sys.exit(app.exec_())
t7.py¶
# PySide6 tutorial 7
import sys
from PySide6 import QtCore, QtGui, QtWidgets
class LCDRange(QtWidgets.QWidget):
valueChanged = QtCore.Signal(int)
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
lcd = QtWidgets.QLCDNumber(2)
self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
self.slider.setRange(0, 99)
self.slider.setValue(0)
self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
lcd, QtCore.SLOT("display(int)"))
self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
self, QtCore.SIGNAL("valueChanged(int)"))
layout = QtWidgets.QVBoxLayout()
layout.addWidget(lcd)
layout.addWidget(self.slider)
self.setLayout(layout)
def value(self):
return self.slider.value()
@QtCore.Slot(int)
def setValue(self, value):
self.slider.setValue(value)
class MyWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
quit = QtWidgets.QPushButton("Quit")
quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
self.connect(quit, QtCore.SIGNAL("clicked()"),
qApp, QtCore.SLOT("quit()"))
grid = QtWidgets.QGridLayout()
previousRange = None
layout = QtWidgets.QVBoxLayout()
layout.addWidget(quit)
layout.addLayout(grid)
self.setLayout(layout)
for row in range(3):
for column in range(3):
lcdRange = LCDRange()
grid.addWidget(lcdRange, row, column)
if previousRange:
self.connect(lcdRange, QtCore.SIGNAL("valueChanged(int)"),
previousRange.setValue)
previousRange = lcdRange
app = QtWidgets.QApplication(sys.argv)
widget = MyWidget()
widget.show()
sys.exit(app.exec_())
t3.py¶
# PySide6 tutorial 3
import sys
from PySide6 import QtCore, QtGui, QtWidgets
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget()
window.resize(200, 120)
quit = QtWidgets.QPushButton("Quit", window)
quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
quit.setGeometry(10, 40, 180, 40)
QtCore.QObject.connect(quit, QtCore.SIGNAL("clicked()"),
app, QtCore.SLOT("quit()"))
window.show()
sys.exit(app.exec_())
t4.py¶
# PySide6 tutorial 4
import sys
from PySide6 import QtCore, QtGui, QtWidgets
class MyWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.setFixedSize(200, 120)
self.quit = QtWidgets.QPushButton("Quit", self)
self.quit.setGeometry(62, 40, 75, 30)
self.quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
self.connect(self.quit, QtCore.SIGNAL("clicked()"),
qApp, QtCore.SLOT("quit()"))
app = QtWidgets.QApplication(sys.argv)
widget = MyWidget()
widget.show()
sys.exit(app.exec_())
t1.py¶
# PySide6 tutorial 1
import sys
from PySide6 import QtWidgets
app = QtWidgets.QApplication(sys.argv)
hello = QtWidgets.QPushButton("Hello world!")
hello.resize(100, 30)
hello.show()
sys.exit(app.exec_())
t12.py¶
# PySide6 tutorial 12
import sys
import math
import random
from PySide6 import QtCore, QtGui, QtWidgets
class LCDRange(QtWidgets.QWidget):
valueChanged = QtCore.Signal(int)
def __init__(self, text=None, parent=None):
if isinstance(text, QtWidgets.QWidget):
parent = text
text = None
QtWidgets.QWidget.__init__(self, parent)
self.init()
if text:
self.setText(text)
def init(self):
lcd = QtWidgets.QLCDNumber(2)
self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
self.slider.setRange(0, 99)
self.slider.setValue(0)
self.label = QtWidgets.QLabel()
self.label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop)
self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
lcd, QtCore.SLOT("display(int)"))
self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
self, QtCore.SIGNAL("valueChanged(int)"))
layout = QtWidgets.QVBoxLayout()
layout.addWidget(lcd)
layout.addWidget(self.slider)
layout.addWidget(self.label)
self.setLayout(layout)
self.setFocusProxy(self.slider)
def value(self):
return self.slider.value()
@QtCore.Slot(int)
def setValue(self, value):
self.slider.setValue(value)
def text(self):
return self.label.text()
def setRange(self, minValue, maxValue):
if minValue < 0 or maxValue > 99 or minValue > maxValue:
QtCore.qWarning("LCDRange::setRange(%d, %d)\n"
"\tRange must be 0..99\n"
"\tand minValue must not be greater than maxValue" % (minValue, maxValue))
return
self.slider.setRange(minValue, maxValue)
def setText(self, text):
self.label.setText(text)
class CannonField(QtWidgets.QWidget):
angleChanged = QtCore.Signal(int)
forceChanged = QtCore.Signal(int)
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.currentAngle = 45
self.currentForce = 0
self.timerCount = 0
self.autoShootTimer = QtCore.QTimer(self)
self.connect(self.autoShootTimer, QtCore.SIGNAL("timeout()"),
self.moveShot)
self.shootAngle = 0
self.shootForce = 0
self.target = QtCore.QPoint(0, 0)
self.setPalette(QtGui.QPalette(QtGui.QColor(250, 250, 200)))
self.setAutoFillBackground(True)
self.newTarget()
def angle(self):
return self.currentAngle
@QtCore.Slot(int)
def setAngle(self, angle):
if angle < 5:
angle = 5
if angle > 70:
angle = 70
if self.currentAngle == angle:
return
self.currentAngle = angle
self.update()
self.emit(QtCore.SIGNAL("angleChanged(int)"), self.currentAngle)
def force(self):
return self.currentForce
@QtCore.Slot(int)
def setForce(self, force):
if force < 0:
force = 0
if self.currentForce == force:
return
self.currentForce = force
self.emit(QtCore.SIGNAL("forceChanged(int)"), self.currentForce)
@QtCore.Slot()
def shoot(self):
if self.autoShootTimer.isActive():
return
self.timerCount = 0
self.shootAngle = self.currentAngle
self.shootForce = self.currentForce
self.autoShootTimer.start(5)
firstTime = True
def newTarget(self):
if CannonField.firstTime:
CannonField.firstTime = False
midnight = QtCore.QTime(0, 0, 0)
random.seed(midnight.secsTo(QtCore.QTime.currentTime()))
self.target = QtCore.QPoint(200 + random.randint(0, 190 - 1), 10 + random.randint(0, 255 - 1))
self.update()
@QtCore.Slot()
def moveShot(self):
region = QtGui.QRegion(self.shotRect())
self.timerCount += 1
shotR = self.shotRect()
if shotR.intersects(self.targetRect()):
self.autoShootTimer.stop()
self.emit(QtCore.SIGNAL("hit()"))
elif shotR.x() > self.width() or shotR.y() > self.height():
self.autoShootTimer.stop()
self.emit(QtCore.SIGNAL("missed()"))
else:
region = region.united(QtGui.QRegion(shotR))
self.update(region)
def paintEvent(self, event):
painter = QtGui.QPainter(self)
self.paintCannon(painter)
if self.autoShootTimer.isActive():
self.paintShot(painter)
self.paintTarget(painter)
def paintShot(self, painter):
painter.setPen(QtCore.Qt.NoPen)
painter.setBrush(QtCore.Qt.black)
painter.drawRect(self.shotRect())
def paintTarget(self, painter):
painter.setPen(QtCore.Qt.black)
painter.setBrush(QtCore.Qt.red)
painter.drawRect(self.targetRect())
barrelRect = QtCore.QRect(33, -4, 15, 8)
def paintCannon(self, painter):
painter.setPen(QtCore.Qt.NoPen)
painter.setBrush(QtCore.Qt.blue)
painter.save()
painter.translate(0, self.height())
painter.drawPie(QtCore.QRect(-35, -35, 70, 70), 0, 90 * 16)
painter.rotate(-self.currentAngle)
painter.drawRect(CannonField.barrelRect)
painter.restore()
def cannonRect(self):
result = QtCore.QRect(0, 0, 50, 50)
result.moveBottomLeft(self.rect().bottomLect())
return result
def shotRect(self):
gravity = 4.0
time = self.timerCount / 40.0
velocity = self.shootForce
radians = self.shootAngle * 3.14159265 / 180
velx = velocity * math.cos(radians)
vely = velocity * math.sin(radians)
x0 = (CannonField.barrelRect.right() + 5) * math.cos(radians)
y0 = (CannonField.barrelRect.right() + 5) * math.sin(radians)
x = x0 + velx * time
y = y0 + vely * time - 0.5 * gravity * time * time
result = QtCore.QRect(0, 0, 6, 6)
result.moveCenter(QtCore.QPoint(round(x), self.height() - 1 - round(y)))
return result
def targetRect(self):
result = QtCore.QRect(0, 0, 20, 10)
result.moveCenter(QtCore.QPoint(self.target.x(), self.height() - 1 - self.target.y()))
return result
class MyWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
quit = QtWidgets.QPushButton("&Quit")
quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
self.connect(quit, QtCore.SIGNAL("clicked()"),
qApp, QtCore.SLOT("quit()"))
angle = LCDRange("ANGLE")
angle.setRange(5, 70)
force = LCDRange("FORCE")
force.setRange(10, 50)
cannonField = CannonField()
self.connect(angle, QtCore.SIGNAL("valueChanged(int)"),
cannonField.setAngle)
self.connect(cannonField, QtCore.SIGNAL("angleChanged(int)"),
angle.setValue)
self.connect(force, QtCore.SIGNAL("valueChanged(int)"),
cannonField.setForce)
self.connect(cannonField, QtCore.SIGNAL("forceChanged(int)"),
force.setValue)
shoot = QtWidgets.QPushButton("&Shoot")
shoot.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
self.connect(shoot, QtCore.SIGNAL("clicked()"), cannonField.shoot)
topLayout = QtWidgets.QHBoxLayout()
topLayout.addWidget(shoot)
topLayout.addStretch(1)
leftLayout = QtWidgets.QVBoxLayout()
leftLayout.addWidget(angle)
leftLayout.addWidget(force)
gridLayout = QtWidgets.QGridLayout()
gridLayout.addWidget(quit, 0, 0)
gridLayout.addLayout(topLayout, 0, 1)
gridLayout.addLayout(leftLayout, 1, 0)
gridLayout.addWidget(cannonField, 1, 1, 2, 1)
gridLayout.setColumnStretch(1, 10)
self.setLayout(gridLayout)
angle.setValue(60)
force.setValue(25)
angle.setFocus()
app = QtWidgets.QApplication(sys.argv)
widget = MyWidget()
widget.setGeometry(100, 100, 500, 355)
widget.show()
sys.exit(app.exec_())
t2.py¶
# PySide6 tutorial 2
import sys
from PySide6 import QtCore, QtGui, QtWidgets
app = QtWidgets.QApplication(sys.argv)
quit = QtWidgets.QPushButton("Quit")
quit.resize(75, 30)
quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
QtCore.QObject.connect(quit, QtCore.SIGNAL("clicked()"),
app, QtCore.SLOT("quit()"))
quit.show()
sys.exit(app.exec_())
t5.py¶
# PySide6 tutorial 5
import sys
from PySide6 import QtCore, QtGui, QtWidgets
class MyWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
quit = QtWidgets.QPushButton("Quit")
quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
lcd = QtWidgets.QLCDNumber(2)
slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
slider.setRange(0, 99)
slider.setValue(0)
self.connect(quit, QtCore.SIGNAL("clicked()"),
qApp, QtCore.SLOT("quit()"))
self.connect(slider, QtCore.SIGNAL("valueChanged(int)"),
lcd, QtCore.SLOT("display(int)"))
layout = QtWidgets.QVBoxLayout()
layout.addWidget(quit)
layout.addWidget(lcd)
layout.addWidget(slider)
self.setLayout(layout)
app = QtWidgets.QApplication(sys.argv)
widget = MyWidget()
widget.show()
sys.exit(app.exec_())
t11.py¶
# PySide6 tutorial 11
import sys
import math
from PySide6 import QtCore, QtGui, QtWidgets
class LCDRange(QtWidgets.QWidget):
valueChanged = QtCore.Signal(int)
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
lcd = QtWidgets.QLCDNumber(2)
self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
self.slider.setRange(0, 99)
self.slider.setValue(0)
self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
lcd, QtCore.SLOT("display(int)"))
self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
self, QtCore.SIGNAL("valueChanged(int)"))
layout = QtWidgets.QVBoxLayout()
layout.addWidget(lcd)
layout.addWidget(self.slider)
self.setLayout(layout)
self.setFocusProxy(self.slider)
def value(self):
return self.slider.value()
@QtCore.Slot(int)
def setValue(self, value):
self.slider.setValue(value)
def setRange(self, minValue, maxValue):
if minValue < 0 or maxValue > 99 or minValue > maxValue:
QtCore.qWarning("LCDRange::setRange(%d, %d)\n"
"\tRange must be 0..99\n"
"\tand minValue must not be greater than maxValue" % (minValue, maxValue))
return
self.slider.setRange(minValue, maxValue)
class CannonField(QtWidgets.QWidget):
angleChanged = QtCore.Signal(int)
forceChanged = QtCore.Signal(int)
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.currentAngle = 45
self.currentForce = 0
self.timerCount = 0
self.autoShootTimer = QtCore.QTimer(self)
self.connect(self.autoShootTimer, QtCore.SIGNAL("timeout()"),
self.moveShot)
self.shootAngle = 0
self.shootForce = 0
self.setPalette(QtGui.QPalette(QtGui.QColor(250, 250, 200)))
self.setAutoFillBackground(True)
def angle(self):
return self.currentAngle
@QtCore.Slot(int)
def setAngle(self, angle):
if angle < 5:
angle = 5
if angle > 70:
angle = 70
if self.currentAngle == angle:
return
self.currentAngle = angle
self.update()
self.emit(QtCore.SIGNAL("angleChanged(int)"), self.currentAngle)
def force(self):
return self.currentForce
@QtCore.Slot(int)
def setForce(self, force):
if force < 0:
force = 0
if self.currentForce == force:
return
self.currentForce = force
self.emit(QtCore.SIGNAL("forceChanged(int)"), self.currentForce)
@QtCore.Slot()
def shoot(self):
if self.autoShootTimer.isActive():
return
self.timerCount = 0
self.shootAngle = self.currentAngle
self.shootForce = self.currentForce
self.autoShootTimer.start(5)
@QtCore.Slot()
def moveShot(self):
region = QtGui.QRegion(self.shotRect())
self.timerCount += 1
shotR = self.shotRect()
if shotR.x() > self.width() or shotR.y() > self.height():
self.autoShootTimer.stop()
else:
region = region.united(QtGui.QRegion(shotR))
self.update(region)
def paintEvent(self, event):
painter = QtGui.QPainter(self)
self.paintCannon(painter)
if self.autoShootTimer.isActive():
self.paintShot(painter)
def paintShot(self, painter):
painter.setPen(QtCore.Qt.NoPen)
painter.setBrush(QtCore.Qt.black)
painter.drawRect(self.shotRect())
barrelRect = QtCore.QRect(33, -4, 15, 8)
def paintCannon(self, painter):
painter.setPen(QtCore.Qt.NoPen)
painter.setBrush(QtCore.Qt.blue)
painter.save()
painter.translate(0, self.height())
painter.drawPie(QtCore.QRect(-35, -35, 70, 70), 0, 90 * 16)
painter.rotate(-self.currentAngle)
painter.drawRect(CannonField.barrelRect)
painter.restore()
def cannonRect(self):
result = QtCore.QRect(0, 0, 50, 50)
result.moveBottomLeft(self.rect().bottomLect())
return result
def shotRect(self):
gravity = 4.0
time = self.timerCount / 40.0
velocity = self.shootForce
radians = self.shootAngle * 3.14159265 / 180
velx = velocity * math.cos(radians)
vely = velocity * math.sin(radians)
x0 = (CannonField.barrelRect.right() + 5) * math.cos(radians)
y0 = (CannonField.barrelRect.right() + 5) * math.sin(radians)
x = x0 + velx * time
y = y0 + vely * time - 0.5 * gravity * time * time
result = QtCore.QRect(0, 0, 6, 6)
result.moveCenter(QtCore.QPoint(round(x), self.height() - 1 - round(y)))
return result
class MyWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
quit = QtWidgets.QPushButton("&Quit")
quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
self.connect(quit, QtCore.SIGNAL("clicked()"),
qApp, QtCore.SLOT("quit()"))
angle = LCDRange()
angle.setRange(5, 70)
force = LCDRange()
force.setRange(10, 50)
cannonField = CannonField()
self.connect(angle, QtCore.SIGNAL("valueChanged(int)"),
cannonField.setAngle)
self.connect(cannonField, QtCore.SIGNAL("angleChanged(int)"),
angle.setValue)
self.connect(force, QtCore.SIGNAL("valueChanged(int)"),
cannonField.setForce)
self.connect(cannonField, QtCore.SIGNAL("forceChanged(int)"),
force.setValue)
shoot = QtWidgets.QPushButton("&Shoot")
shoot.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
self.connect(shoot, QtCore.SIGNAL("clicked()"), cannonField.shoot)
topLayout = QtWidgets.QHBoxLayout()
topLayout.addWidget(shoot)
topLayout.addStretch(1)
leftLayout = QtWidgets.QVBoxLayout()
leftLayout.addWidget(angle)
leftLayout.addWidget(force)
gridLayout = QtWidgets.QGridLayout()
gridLayout.addWidget(quit, 0, 0)
gridLayout.addLayout(topLayout, 0, 1)
gridLayout.addLayout(leftLayout, 1, 0)
gridLayout.addWidget(cannonField, 1, 1, 2, 1)
gridLayout.setColumnStretch(1, 10)
self.setLayout(gridLayout)
angle.setValue(60)
force.setValue(25)
angle.setFocus()
app = QtWidgets.QApplication(sys.argv)
widget = MyWidget()
widget.setGeometry(100, 100, 500, 355)
widget.show()
sys.exit(app.exec_())
t14.py¶
# PySide6 tutorial 14
import sys
import math
import random
from PySide6 import QtCore, QtGui, QtWidgets
class LCDRange(QtWidgets.QWidget):
valueChanged = QtCore.Signal(int)
def __init__(self, text=None, parent=None):
if isinstance(text, QtWidgets.QWidget):
parent = text
text = None
QtWidgets.QWidget.__init__(self, parent)
self.init()
if text:
self.setText(text)
def init(self):
lcd = QtWidgets.QLCDNumber(2)
self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
self.slider.setRange(0, 99)
self.slider.setValue(0)
self.label = QtWidgets.QLabel()
self.label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop)
self.label.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
lcd, QtCore.SLOT("display(int)"))
self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
self, QtCore.SIGNAL("valueChanged(int)"))
layout = QtWidgets.QVBoxLayout()
layout.addWidget(lcd)
layout.addWidget(self.slider)
layout.addWidget(self.label)
self.setLayout(layout)
self.setFocusProxy(self.slider)
def value(self):
return self.slider.value()
@QtCore.Slot(int)
def setValue(self, value):
self.slider.setValue(value)
def text(self):
return self.label.text()
def setRange(self, minValue, maxValue):
if minValue < 0 or maxValue > 99 or minValue > maxValue:
QtCore.qWarning("LCDRange::setRange(%d, %d)\n"
"\tRange must be 0..99\n"
"\tand minValue must not be greater than maxValue" % (minValue, maxValue))
return
self.slider.setRange(minValue, maxValue)
def setText(self, text):
self.label.setText(text)
class CannonField(QtWidgets.QWidget):
angleChanged = QtCore.Signal(int)
forceChanged = QtCore.Signal(int)
hit = QtCore.Signal()
missed = QtCore.Signal()
canShoot = QtCore.Signal(bool)
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.currentAngle = 45
self.currentForce = 0
self.timerCount = 0
self.autoShootTimer = QtCore.QTimer(self)
self.connect(self.autoShootTimer, QtCore.SIGNAL("timeout()"),
self.moveShot)
self.shootAngle = 0
self.shootForce = 0
self.target = QtCore.QPoint(0, 0)
self.gameEnded = False
self.barrelPressed = False
self.setPalette(QtGui.QPalette(QtGui.QColor(250, 250, 200)))
self.setAutoFillBackground(True)
self.newTarget()
def angle(self):
return self.currentAngle
@QtCore.Slot(int)
def setAngle(self, angle):
if angle < 5:
angle = 5
if angle > 70:
angle = 70
if self.currentAngle == angle:
return
self.currentAngle = angle
self.update()
self.emit(QtCore.SIGNAL("angleChanged(int)"), self.currentAngle)
def force(self):
return self.currentForce
@QtCore.Slot(int)
def setForce(self, force):
if force < 0:
force = 0
if self.currentForce == force:
return
self.currentForce = force
self.emit(QtCore.SIGNAL("forceChanged(int)"), self.currentForce)
@QtCore.Slot()
def shoot(self):
if self.isShooting():
return
self.timerCount = 0
self.shootAngle = self.currentAngle
self.shootForce = self.currentForce
self.autoShootTimer.start(5)
self.emit(QtCore.SIGNAL("canShoot(bool)"), False)
firstTime = True
def newTarget(self):
if CannonField.firstTime:
CannonField.firstTime = False
midnight = QtCore.QTime(0, 0, 0)
random.seed(midnight.secsTo(QtCore.QTime.currentTime()))
self.target = QtCore.QPoint(200 + random.randint(0, 190 - 1), 10 + random.randint(0, 255 - 1))
self.update()
def setGameOver(self):
if self.gameEnded:
return
if self.isShooting():
self.autoShootTimer.stop()
self.gameEnded = True
self.update()
def restartGame(self):
if self.isShooting():
self.autoShootTimer.stop()
self.gameEnded = False
self.update()
self.emit(QtCore.SIGNAL("canShoot(bool)"), True)
@QtCore.Slot()
def moveShot(self):
region = QtGui.QRegion(self.shotRect())
self.timerCount += 1
shotR = self.shotRect()
if shotR.intersects(self.targetRect()):
self.autoShootTimer.stop()
self.emit(QtCore.SIGNAL("hit()"))
self.emit(QtCore.SIGNAL("canShoot(bool)"), True)
elif shotR.x() > self.width() or shotR.y() > self.height() or shotR.intersects(self.barrierRect()):
self.autoShootTimer.stop()
self.emit(QtCore.SIGNAL("missed()"))
self.emit(QtCore.SIGNAL("canShoot(bool)"), True)
else:
region = region.united(QtGui.QRegion(shotR))
self.update(region)
def mousePressEvent(self, event):
if event.button() != QtCore.Qt.LeftButton:
return
if self.barrelHit(event.pos()):
self.barrelPressed = True
def mouseMoveEvent(self, event):
if not self.barrelPressed:
return
pos = event.pos()
if pos.x() <= 0:
pos.setX(1)
if pos.y() >= self.height():
pos.setY(self.height() - 1)
rad = math.atan((float(self.rect().bottom()) - pos.y()) / pos.x())
self.setAngle(round(rad * 180 / 3.14159265))
def mouseReleaseEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
self.barrelPressed = False
def paintEvent(self, event):
painter = QtGui.QPainter(self)
if self.gameEnded:
painter.setPen(QtCore.Qt.black)
painter.setFont(QtGui.QFont("Courier", 48, QtGui.QFont.Bold))
painter.drawText(self.rect(), QtCore.Qt.AlignCenter, "Game Over")
self.paintCannon(painter)
self.paintBarrier(painter)
if self.isShooting():
self.paintShot(painter)
if not self.gameEnded:
self.paintTarget(painter)
def paintShot(self, painter):
painter.setPen(QtCore.Qt.NoPen)
painter.setBrush(QtCore.Qt.black)
painter.drawRect(self.shotRect())
def paintTarget(self, painter):
painter.setPen(QtCore.Qt.black)
painter.setBrush(QtCore.Qt.red)
painter.drawRect(self.targetRect())
def paintBarrier(self, painter):
painter.setPen(QtCore.Qt.black)
painter.setBrush(QtCore.Qt.yellow)
painter.drawRect(self.barrierRect())
barrelRect = QtCore.QRect(33, -4, 15, 8)
def paintCannon(self, painter):
painter.setPen(QtCore.Qt.NoPen)
painter.setBrush(QtCore.Qt.blue)
painter.save()
painter.translate(0, self.height())
painter.drawPie(QtCore.QRect(-35, -35, 70, 70), 0, 90 * 16)
painter.rotate(-self.currentAngle)
painter.drawRect(CannonField.barrelRect)
painter.restore()
def cannonRect(self):
result = QtCore.QRect(0, 0, 50, 50)
result.moveBottomLeft(self.rect().bottomLect())
return result
def shotRect(self):
gravity = 4.0
time = self.timerCount / 40.0
velocity = self.shootForce
radians = self.shootAngle * 3.14159265 / 180
velx = velocity * math.cos(radians)
vely = velocity * math.sin(radians)
x0 = (CannonField.barrelRect.right() + 5) * math.cos(radians)
y0 = (CannonField.barrelRect.right() + 5) * math.sin(radians)
x = x0 + velx * time
y = y0 + vely * time - 0.5 * gravity * time * time
result = QtCore.QRect(0, 0, 6, 6)
result.moveCenter(QtCore.QPoint(round(x), self.height() - 1 - round(y)))
return result
def targetRect(self):
result = QtCore.QRect(0, 0, 20, 10)
result.moveCenter(QtCore.QPoint(self.target.x(), self.height() - 1 - self.target.y()))
return result
def barrierRect(self):
return QtCore.QRect(145, self.height() - 100, 15, 99)
def barrelHit(self, pos):
matrix = QtGui.QTransform()
matrix.translate(0, self.height())
matrix.rotate(-self.currentAngle)
matrix, invertible = matrix.inverted()
return self.barrelRect.contains(matrix.map(pos))
def gameOver(self):
return self.gameEnded
def isShooting(self):
return self.autoShootTimer.isActive()
def sizeHint(self):
return QtCore.QSize(400, 300)
class GameBoard(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
quit = QtWidgets.QPushButton("&Quit")
quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
self.connect(quit, QtCore.SIGNAL("clicked()"),
qApp, QtCore.SLOT("quit()"))
angle = LCDRange("ANGLE")
angle.setRange(5, 70)
force = LCDRange("FORCE")
force.setRange(10, 50)
cannonBox = QtWidgets.QFrame()
cannonBox.setFrameStyle(QtWidgets.QFrame.WinPanel | QtWidgets.QFrame.Sunken)
self.cannonField = CannonField()
self.connect(angle, QtCore.SIGNAL("valueChanged(int)"),
self.cannonField.setAngle)
self.connect(self.cannonField, QtCore.SIGNAL("angleChanged(int)"),
angle.setValue)
self.connect(force, QtCore.SIGNAL("valueChanged(int)"),
self.cannonField.setForce)
self.connect(self.cannonField, QtCore.SIGNAL("forceChanged(int)"),
force.setValue)
self.connect(self.cannonField, QtCore.SIGNAL("hit()"), self.hit)
self.connect(self.cannonField, QtCore.SIGNAL("missed()"), self.missed)
shoot = QtWidgets.QPushButton("&Shoot")
shoot.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
self.connect(shoot, QtCore.SIGNAL("clicked()"), self.fire)
self.connect(self.cannonField, QtCore.SIGNAL("canShoot(bool)"),
shoot, QtCore.SLOT("setEnabled(bool)"))
restart = QtWidgets.QPushButton("&New Game")
restart.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
self.connect(restart, QtCore.SIGNAL("clicked()"), self.newGame)
self.hits = QtWidgets.QLCDNumber(2)
self.shotsLeft = QtWidgets.QLCDNumber(2)
hitsLabel = QtWidgets.QLabel("HITS")
shotsLeftLabel = QtWidgets.QLabel("SHOTS LEFT")
QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Enter),
self, self.fire)
QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Return),
self, self.fire)
QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_Q),
self, QtCore.SLOT("close()"))
topLayout = QtWidgets.QHBoxLayout()
topLayout.addWidget(shoot)
topLayout.addWidget(self.hits)
topLayout.addWidget(hitsLabel)
topLayout.addWidget(self.shotsLeft)
topLayout.addWidget(shotsLeftLabel)
topLayout.addStretch(1)
topLayout.addWidget(restart)
leftLayout = QtWidgets.QVBoxLayout()
leftLayout.addWidget(angle)
leftLayout.addWidget(force)
cannonLayout = QtWidgets.QVBoxLayout()
cannonLayout.addWidget(self.cannonField)
cannonBox.setLayout(cannonLayout)
gridLayout = QtWidgets.QGridLayout()
gridLayout.addWidget(quit, 0, 0)
gridLayout.addLayout(topLayout, 0, 1)
gridLayout.addLayout(leftLayout, 1, 0)
gridLayout.addWidget(cannonBox, 1, 1, 2, 1)
gridLayout.setColumnStretch(1, 10)
self.setLayout(gridLayout)
angle.setValue(60)
force.setValue(25)
angle.setFocus()
self.newGame()
@QtCore.Slot()
def fire(self):
if self.cannonField.gameOver() or self.cannonField.isShooting():
return
self.shotsLeft.display(self.shotsLeft.intValue() - 1)
self.cannonField.shoot()
@QtCore.Slot()
def hit(self):
self.hits.display(self.hits.intValue() + 1)
if self.shotsLeft.intValue() == 0:
self.cannonField.setGameOver()
else:
self.cannonField.newTarget()
@QtCore.Slot()
def missed(self):
if self.shotsLeft.intValue() == 0:
self.cannonField.setGameOver()
@QtCore.Slot()
def newGame(self):
self.shotsLeft.display(15)
self.hits.display(0)
self.cannonField.restartGame()
self.cannonField.newTarget()
app = QtWidgets.QApplication(sys.argv)
board = GameBoard()
board.setGeometry(100, 100, 500, 355)
board.show()
sys.exit(app.exec_())
© 2021 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.