#!/usr/bin/env python # TQt tutorial 10. import sys from python_tqt.qt import * class LCDRange(TQVBox): def __init__(self,parent=None,name=None): TQVBox.__init__(self,parent,name) lcd = TQLCDNumber(2,self,'lcd') self.slider = TQSlider(TQt.Horizontal,self,'slider') self.slider.setRange(0,99) self.slider.setValue(0) self.connect(self.slider,SIGNAL('valueChanged(int)'),lcd,SLOT('display(int)')) self.connect(self.slider,SIGNAL('valueChanged(int)'),self,PYSIGNAL('valueChanged(int)')) self.setFocusProxy(self.slider) def value(self): return self.slider.value() def setValue(self,value): self.slider.setValue(value) def setRange(self,minVal,maxVal): if minVal < 0 or maxVal > 99 or minVal > maxVal: raise ValueError, 'LCDRange.setRange(): invalid range' self.slider.setRange(minVal,maxVal) class CannonField(TQWidget): def __init__(self,parent=None,name=None): TQWidget.__init__(self,parent,name) self.ang = 45 self.f = 0 self.setPalette(TQPalette(TQColor(250,250,200))) def angle(self): return self.ang def setAngle(self,degrees): if degrees < 5: degrees = 5 if degrees > 70: degrees = 70 if self.ang == degrees: return self.ang = degrees self.repaint(self.cannonRect(),0) self.emit(PYSIGNAL('angleChanged(int)'),(self.ang,)) def force(self): return self.f def setForce(self,newton): if newton < 0: newton = 0 if self.f == newton: return self.f = newton self.emit(PYSIGNAL('forceChanged(int)'),(self.f,)) def paintEvent(self,ev): if not ev.rect().intersects(self.cannonRect()): return cr = self.cannonRect() pix = TQPixmap(cr.size()) pix.fill(self,cr.topLeft()) p = TQPainter(pix) p.setBrush(TQt.blue) p.setPen(TQt.NoPen) p.translate(0,pix.height() - 1) p.drawPie(TQRect(-35,-35,70,70),0,90 * 16) p.rotate(-self.ang) p.drawRect(TQRect(33,-4,15,8)) p.end() p.begin(self) p.drawPixmap(cr.topLeft(),pix) def cannonRect(self): r = TQRect(0,0,50,50) r.moveBottomLeft(self.rect().bottomLeft()) return r def sizePolicy(self): return TQSizePolicy(TQSizePolicy.Expanding,TQSizePolicy.Expanding) class MyWidget(TQWidget): def __init__(self,parent=None,name=None): TQWidget.__init__(self,parent,name) quit = TQPushButton('&Quit',self,'quit') quit.setFont(TQFont('Times',18,TQFont.Bold)) self.connect(quit,SIGNAL('clicked()'),tqApp,SLOT('quit()')) self.angle = LCDRange(self,'angle') self.angle.setRange(5,70) self.force = LCDRange(self,'force') self.force.setRange(10,50) self.cannonField = CannonField(self,'cannonField') self.connect(self.angle,PYSIGNAL('valueChanged(int)'),self.cannonField.setAngle) self.connect(self.cannonField,PYSIGNAL('angleChanged(int)'),self.angle.setValue) self.connect(self.force,PYSIGNAL('valueChanged(int)'),self.cannonField.setForce) self.connect(self.cannonField,PYSIGNAL('forceChanged(int)'),self.force.setValue) grid = TQGridLayout(self,2,2,10) grid.addWidget(quit,0,0) grid.addWidget(self.cannonField,1,1) grid.setColStretch(1,10) leftBox = TQVBoxLayout() grid.addLayout(leftBox,1,0) leftBox.addWidget(self.angle) leftBox.addWidget(self.force) self.angle.setValue(60) self.force.setValue(25) self.angle.setFocus() TQApplication.setColorSpec(TQApplication.CustomColor) a = TQApplication(sys.argv) w = MyWidget() w.setGeometry(100,100,500,355) a.setMainWidget(w) w.show() a.exec_loop()