Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: (Opgelost) PyQt factuur printen  (gelezen 3545 keer)

(Opgelost) PyQt factuur printen
« Gepost op: 2011/07/31, 10:42:19 »
Goedendag iedereen,

Voor mijn moeke ben ik een administratie applicatie aan het schrijven in PyQt. Hierin kan ze gewerkte uren opgeven.
Nu is het de bedoeling dat ze ook facturen kan uitprinten. Ik ben gaan zoeken en ben even aan het twijfelen hoe ik dit het beste aanpak. Ik zit te denken aan twee opties:

1) In eerste instantie had ik met de designer een formulier aangemaakt. Ik vraag mij echter af of dit wel de beste oplossing is om een QWidget uit te printen (en of dit uberhaubt mogelijk is). Ongeacht of het mogelijk is vraag ik me ook af of dit wel een gebruikelijke manier is.

2) Nu kwam ik dit tegen: http://diotavelli.net/PyQtWiki/Printing_a_Worksheet wat in feite betekend dat het via html kan. Op zich zou dit makkelijker moeten zijn qua layout van het formulier opstellen.

Wat is de beste oplossing om een factuur te maken en te printen in PyQt?

Groeten, Koen
« Laatst bewerkt op: 2011/08/04, 13:55:40 door Koen Bokern »

Re: PyQt factuur printen
« Reactie #1 Gepost op: 2011/08/03, 20:42:07 »
Helaas nog geen reacties :P Ik hoop dat er mensen zijn hier die hier kaas van hebben gegeten, ik ben er namelijk nog niet helemaal uit.

Ik ben inmiddels al iets verder. Dit is wat ik tot nu toe heb:

class printer():
def __init__(self, parent=None):
self.parent = parent;
self.printer = None;
self.painter = None;

def load(self):
if(self.printer):
del self.printer;
if(self.painter):
del self.painter;

self.printer = QPrinter(QPrinter.PrinterResolution)
self.printer.setPageSize(self.printer.A4);
self.printer.setFullPage (True);
self.pages = [];

def addPage(self, textEdit):
self.pages.append(textEdit);

def handle(self):
self.painter = QPainter(self.printer)
l=1;
for i in self.pages:
rect = self.printer.pageRect();
size = self.printer.paperSize(QPrinter.Point);


html = i.toHtml();

QTextDoc = QTextDocument();
QTextDoc.setDefaultFont(i.font());
QTextDoc.setDocumentMargin(20);
QTextDoc.setTextWidth( rect.width() );
QTextDoc.setPageSize(size);
QTextDoc.setHtml(html);
QTextDoc.print_(self.printer);
QTextDoc.drawContents(self.painter);

if (l<len(self.pages)):
self.printer.newPage();
l=l+1;
self.painter.end()



def printSelection(self):
dialog = QtGui.QPrintDialog(self.printer)
if(dialog.exec_() == QtGui.QDialog.Accepted):
self.handle();

Een factuur zit in QTextEdit en die voeg ik voor het printen toe aan deze class via addPage(); Vervolgens roep ik printSelection aan.
Ik krijg nu netjes een dialog waar ik de printer kan selecteren en andere opties kan doen. Printen werkt nu.

Maar dit is volgens mij niet helemaal zoals het hoort.Sowieso wil ik nog eventueel een QPrintPreviewDialog erbij. Ook krijg ik de fout:
QPainter::begin: A paint device can only be painted by one painter at a time.
Overigens doe ik nu per pagina een QTextDocument aanmaken. Ik kreeg het idee dat deze class wel meerdere pagina's  ondersteund. Alleen weet ik even niet hoe dit moet. Het zou denk ik wel een betere oplossing zijn.

Ik hoop dat iemand mij verder kan helpen :)

Re: PyQt factuur printen
« Reactie #2 Gepost op: 2011/08/03, 21:41:48 »
Ik kan niet helpen, heb enkel ervaring met printen in PyGTK, maar wil toch even dit aanhalen:

Don't terminate all of your statements with a semicolon. It's technically legal to do this in Python, but is totally useless unless you're placing more than one statement on a single line (e.g., x=1; y=2; z=3).

De punt-komma heeft totaal geen nut in de bovenstaande code, het brengt enkel meer typwerk en eventueel mindere leesbaarheid met zich mee :).

Re: PyQt factuur printen
« Reactie #3 Gepost op: 2011/08/04, 06:13:40 »
Ja, daar heeft U gelijk in. Ben het een beetje gewend van PHP. Ik zal er een beetje op letten :P

Maargoed... Nu even gaan slapen (kom net terug van werk) en dan maar weer eens verder proberen. Vind het vervelend dat er weinig (goede) documentatie is. Alleen de classes en methods zijn redelijk goed beschreven, maar dat zijn losse dingen. Ik zal het in ieder geval niet opgeven.

Re: (Opgelost) PyQt factuur printen
« Reactie #4 Gepost op: 2011/08/04, 13:59:18 »
Het probleem is opgelost. Ik heb nog eens gekeken naar QTextEdit en begon eens met de textCursor te experimenteren. Nu krijg ik een nieuwe pagina voor iedere factuur, de marges die zijn nu volgens de standaard en ik heb geen probleem meer met de QPainter.

De aanpassing die ik nu heb gedaan:
def handle(self):
self.doc = QTextEdit();

i=1;
for p in self.pages:
cursor = self.doc.textCursor()
cursor.insertHtml(p.toHtml())

if ( i < len(self.pages) ):
block = QTextBlockFormat()
block.setPageBreakPolicy(QTextFormat.PageBreak_AlwaysBefore)
cursor.insertBlock(block)
i=i+1;
« Laatst bewerkt op: 2011/08/04, 15:27:28 door Koen Bokern »