#!/usr/bin/env python
# A simple application.
import sys, string
from qt import *
fileopen = [
'16 13 5 1',
'. c #040404',
'# c #808304',
'a c None',
'b c #f3f704',
'c c #f3f7f3',
'aaaaaaaaa...aaaa',
'aaaaaaaa.aaa.a.a',
'aaaaaaaaaaaaa..a',
'a...aaaaaaaa...a',
'.bcb.......aaaaa',
'.cbcbcbcbc.aaaaa',
'.bcbcbcbcb.aaaaa',
'.cbcb...........',
'.bcb.#########.a',
'.cb.#########.aa',
'.b.#########.aaa',
'..#########.aaaa',
'...........aaaaa'
]
filesave = [
'14 14 4 1',
'. c #040404',
'# c #808304',
'a c #bfc2bf',
'b c None',
'..............',
'.#.aaaaaaaa.a.',
'.#.aaaaaaaa...',
'.#.aaaaaaaa.#.',
'.#.aaaaaaaa.#.',
'.#.aaaaaaaa.#.',
'.#.aaaaaaaa.#.',
'.##........##.',
'.############.',
'.##.........#.',
'.##......aa.#.',
'.##......aa.#.',
'.##......aa.#.',
'b.............'
]
fileprint = [
'16 14 6 1',
'. c #000000',
'# c #848284',
'a c #c6c3c6',
'b c #ffff00',
'c c #ffffff',
'd c None',
'ddddd.........dd',
'dddd.cccccccc.dd',
'dddd.c.....c.ddd',
'ddd.cccccccc.ddd',
'ddd.c.....c....d',
'dd.cccccccc.a.a.',
'd..........a.a..',
'.aaaaaaaaaa.a.a.',
'.............aa.',
'.aaaaaa###aa.a.d',
'.aaaaaabbbaa...d',
'.............a.d',
'd.aaaaaaaaa.a.dd',
'dd...........ddd'
]
document = [
"12 16 6 1",
" c #040404",
". c None",
"X c white",
"o c #808304",
"O c black",
"+ c #f3f7f3",
" .....",
" XXXXX ....",
" XXXXX X ...",
" XXXXX XX ..",
" XooXX O.",
" X+XXX+XXXO.",
" XXXXXXXXXO.",
" XoooXooXXO.",
" XXXXXXXXXO.",
" XXXXXXXXXO.",
" XoXXoooXXO.",
" XXXXXXXXXO.",
"OXXXXXXXXXO.",
"OXXXXXXXXXO.",
"OOOOOOOOOOO.",
"............"
]
fileOpenText = \
'''
Click this button to open a new file.
You can also select the Open command from the File menu.'''
fileSaveText = \
'''Click this button to save the file you are editing.
You will be prompted for a filename.
You can also select the Save command from the File menu.'''
filePrintText = \
'''Click this button to print the file you are editing.
You can also select the Print command from the File menu.'''
True=1
False=0
class ApplicationWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self,None,'example application main window',Qt.WDestructiveClose)
self.filename = QString.null
self.printer = QPrinter()
self.fileTools = QToolBar(self,'file operations')
openIcon = QPixmap(fileopen)
self.fileOpen = QToolButton(QIconSet(openIcon),'Open File',QString.null,self.load,self.fileTools,'open file')
saveIcon = QPixmap(filesave)
self.fileSave = QToolButton(QIconSet(saveIcon),'Save File',QString.null,self.save,self.fileTools,'save file')
printIcon = QPixmap(fileprint)
self.filePrint = QToolButton(QIconSet(printIcon),'Print File',QString.null,self.printDoc,self.fileTools,'print file')
QWhatsThis.whatsThisButton(self.fileTools)
QWhatsThis.add(self.fileOpen,fileOpenText)
QMimeSourceFactory.defaultFactory().setPixmap('fileopen',openIcon)
QWhatsThis.add(self.fileSave,fileSaveText)
QWhatsThis.add(self.filePrint,filePrintText)
self.file = QPopupMenu(self)
self.menuBar().insertItem('&File',self.file)
self.file.insertItem('&New',self.newDoc,Qt.CTRL + Qt.Key_N)
id = self.file.insertItem(QIconSet(openIcon),'&Open',self.load,Qt.CTRL + Qt.Key_O)
self.file.setWhatsThis(id,fileOpenText)
id = self.file.insertItem(QIconSet(saveIcon),'&Save',self.save,Qt.CTRL + Qt.Key_S)
self.file.setWhatsThis(id,fileSaveText)
id = self.file.insertItem('Save &as',self.saveAs)
self.file.setWhatsThis(id,fileSaveText)
self.file.insertSeparator()
id = self.file.insertItem(QIconSet(printIcon),'&Print',self.printDoc,Qt.CTRL + Qt.Key_P)
self.file.setWhatsThis(id,filePrintText)
self.file.insertSeparator()
self.file.insertItem('&Close',self,SLOT('close()'),Qt.CTRL + Qt.Key_W)
self.file.insertItem('&Quit',qApp,SLOT('closeAllWindows()'),Qt.CTRL + Qt.Key_Q)
self.menuBar().insertSeparator()
self.windows = QPopupMenu( self )
self.windows.setCheckable( True )
self.connect( self.windows, SIGNAL( "aboutToShow()" ),
self.windowsMenuAboutToShow )
self.menuBar().insertItem( "&Windows", self.windows )
self.help = QPopupMenu(self)
self.menuBar().insertSeparator()
self.menuBar().insertItem('&Help',self.help)
self.help.insertItem('&About',self.about,Qt.Key_F1)
self.help.insertItem('About &Qt',self.aboutQt)
self.help.insertSeparator()
self.help.insertItem( "What's &This", self, SLOT("whatsThis()"), Qt.SHIFT+Qt.Key_F1)
self.menuBar().insertSeparator()
self.vb = QVBox( self )
self.vb.setFrameStyle( QFrame.StyledPanel | QFrame.Sunken )
self.ws = QWorkspace( self.vb )
self.ws.setScrollBarsEnabled( True )
self.setCentralWidget( self.vb )
self.statusBar().message('Ready',2000)
#self.resize(450,600)
def newDoc(self):
w = MDIWindow( self.ws, "", Qt.WDestructiveClose )
self.connect( w, PYSIGNAL( "message" ), self.statusBar(), SLOT( "message(const QString&, int )") )
w.setCaption("unnamed document")
w.setIcon( QPixmap(document) )
# show the very first window in maximized mode
if len(self.ws.windowList())==0:
w.showMaximized()
else:
w.show()
return w
def load(self):
fn = QFileDialog.getOpenFileName( QString.null, QString.null, self )
if not fn.isEmpty():
w = self.newDoc()
w.load( fn )
else:
self.statusBar().message( "Loading aborted", 2000 )
def save(self):
m = self.ws.activeWindow()
if m:
m.save()
def saveAs(self):
m = self.ws.activeWindow()
if m:
m.saveAs()
def printDoc(self):
m = self.ws.activeWindow()
if m:
m.printDoc( self.printer )
def closeWindow(self):
m = self.ws.activeWindow()
if m:
m.close()
def about(self):
QMessageBox.about( self, "Qt Application Example",
"This example demonstrates simple use of\n "
"Qt's Multiple Document Interface (MDI).")
def aboutQt(self):
QMessageBox.aboutQt( self, "Qt Application Example" )
def windowsMenuAboutToShow(self):
self.windows.clear()
cascadeId = self.windows.insertItem("&Cascade", self.ws, SLOT("cascade() ") )
tileId = self.windows.insertItem("&Tile", self.ws, SLOT("tile()" ) )
if len(self.ws.windowList())==0 :
self.windows.setItemEnabled( cascadeId, False )
self.windows.setItemEnabled( tileId, False )
self.windows.insertSeparator()
windows = self.ws.windowList()
cnt=0
for i in windows:
id =self.windows.insertItem(i.caption(),self.windowsMenuActivated )
self.windows.setItemParameter( id, cnt );
self.windows.setItemChecked( id, self.ws.activeWindow() == i )
cnt=cnt+1
def windowsMenuActivated(self,sid ):
w = self.ws.windowList().at( id )
if w:
w.showNormal()
w.setFocus()
class MDIWindow( QMainWindow):
def __init__(self,parent, name, wflags ):
QMainWindow.__init__(self,parent, name, wflags )
self.mmovie = 0
self.medit = QMultiLineEdit( self )
self.setFocusProxy( self.medit )
self.setCentralWidget( self.medit );
def load(self, fn ):
self.filename = fn
self.f=QFile( self.filename )
if not self.f.open( IO_ReadOnly ):
return
if fn.contains(".gif"):
tmp=QWidget(self)
self.setFocusProxy(tmp)
self.setCentralWidget(tmp)
self.medit.hide()
del self.medit
qm=QMovie(fn)
#ifdef Q_WS_QWS // temporary speed-test hack
#qm->setDisplayWidget(tmp);
#endif
tmp.setBackgroundMode(QWidget.NoBackground)
tmp.show()
self.mmovie=qm
else :
self.mmovie = 0
t=QTextStream(self.f)
s = t.read()
self.medit.setText( s )
self.f.close()
self.setCaption( self.filename )
self.emit(PYSIGNAL( "message"),(QString("Loaded document %1").arg(self.filename),2000 ))
def save(self):
if self.filename.isEmpty():
self.saveAs()
return
text = self.medit.text()
output=open(str(self.filename),'w')
output.write(str(text))
#emit message( QString("Could not write to %1").arg(filename), 2000 );
#return
output.close()
self.setCaption(self.filename)
self.emit(PYSIGNAL( "message"),(QString("File %1 saved").arg(self.filename),2000 ))
def saveAs(self):
fn = QFileDialog.getSaveFileName( self.filename, QString.null, self )
if not fn.isEmpty():
self.filename = fn
self.save()
else :
self.emit(PYSIGNAL( "message"),(QString("Saving aborted"),2000 ))
def printDoc(self,printer):
Margin = 10
pageNo = 1
if printer.setup(self):
self.emit(PYSIGNAL( "message"),(QString("Printing..."),2000 ))
p = QPainter()
p.begin(printer)
p.setFont(self.medit.font())
yPos = 0
fm = p.fontMetrics()
metrics = QPaintDeviceMetrics(printer)
for i in range(self.medit.numLines()):
if Margin + yPos > metrics.height() - Margin:
pageNo = pageNo + 1
self.emit(PYSIGNAL( "message"),(QString("Printing (page %1) ...").arg(pageNo),2000 ))
printer.newPage()
yPos = 0
p.drawText(Margin,Margin + yPos,metrics.width(),fm.lineSpacing(),Qt.ExpandTabs | Qt.DontClip,self.medit.textLine(i))
yPos = yPos + fm.lineSpacing()
p.end()
self.emit(PYSIGNAL( "message"),(QString("Printing completed"),2000 ))
else:
self.emit(PYSIGNAL( "message"),(QString("Printing aborted"),2000 ))
if __name__=='__main__':
a = QApplication(sys.argv)
mw = ApplicationWindow()
mw.setCaption("PyQt Example - Multiple Documents Interface (MDI)")
mw.show()
a.connect(a, SIGNAL('lastWindowClosed()'), a, SLOT('quit()'))
a.exec_loop()