Wie kann man Daten im Tabellenformat drucken?

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
klaus66
User
Beiträge: 51
Registriert: Mittwoch 11. März 2009, 09:26
Wohnort: Bergisch Gladbach-Bensberg

Hallo zusammen,
ich habe unter Qt4Py eine Applikation gebaut, die mit mehreren Tabellen arbeitet. Die Applikation erstellt Einrahmungs Aufträge, die in einer SQL3 DB abgespeichert werden. Das alles funktioniert hervorragend und sieht auch super aus.
Das Ganze ist natürlich kein Selbstzweck und keine Spielerei. In der Praxis brauche ich jetzt einen vernünftig formatierten Ausdruck jedes Auftrags als Beleg. Und da beginnt mein Problem. Wie kriege ich eine Tabelle programm gesteuert, genau so ausgedruckt, wie am Bildschirm angezeigt.
Alle Versuche mit Formatanweisung (u"%s...." usw.) führen selbst bei Unispace-Schriften nur zu sehr unschönen, schlecht formatierten Ausdrucken.

Hat jemand eine Idee, wie man Tabellen tabellarisch drucken kann? Mir schwebt ein Verfahren vor, wie ich es mit OpenOffice realisiert hatte. Dort kann ein Tabellen-Formular erzeugen, in dem man jede Zelle direkt adressieren kann. Aber ich will natürlich kein OOo verwenden.
Mit freundlichem Gruß Klaus

Das Geheimnis des Könnens liegt im Wollen!
Ubuntu 9.10 64Bit, AMD Athlon 64/Opteron 3200+, 1GB RAM, NVIDIA GeForce7, 250GB SATA 80GB USB und Asus Eee PC 4G mit Ubuntu-eee-8.04.1\\
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

Hmmm... Bei Tabelle fällt mir als erstes immer HTML ein.
Du könntest deine ganzen Daten über eine <table> in ein QTextDocument packen. Hat den Vortiel, dass du auch noch nen (schön formatierten) Vorspann und Nachspann und sonstwas (z.B. weitere Tabellen :)) mit einbinden kannst.

Wenn du einfach nur das Widget rendern willst, das geht natürlich auch :D

Code: Alles auswählen

t = QTableWidget(10,10)
p = QPrinter()
p.setOutputFormat(QPrinter.PdfFormat)
p.setOutputFileName("/tmp/test.pdf")
t.render(p)
Ist natürlich nicht der Hit bei ner Tabelle :P
Benutzeravatar
klaus66
User
Beiträge: 51
Registriert: Mittwoch 11. März 2009, 09:26
Wohnort: Bergisch Gladbach-Bensberg

@franzf,
danke, das war schon mal ein guter Hinweis, der mich möglicherweise auf die richte Spur gebracht hat. :wink:
Manchmal sitzt man vor dem Bildschirm und sieht den Wald vor lauter Bäumen nicht.
Nochmal danke,
Mit freundlichem Gruß Klaus

Das Geheimnis des Könnens liegt im Wollen!
Ubuntu 9.10 64Bit, AMD Athlon 64/Opteron 3200+, 1GB RAM, NVIDIA GeForce7, 250GB SATA 80GB USB und Asus Eee PC 4G mit Ubuntu-eee-8.04.1\\
Benutzeravatar
klaus66
User
Beiträge: 51
Registriert: Mittwoch 11. März 2009, 09:26
Wohnort: Bergisch Gladbach-Bensberg

Ich fürchte ich brauche doch noch mal einen Anstoß, um weiter zu kommen. Ich schaffe es zwar den Beitext und die Tabelle zu drucken, aber immer auf einer separaten Seite. Das ist natürlich nicht das was ich will. Ich brauche ein druckbares Dokument, in dem sowohl der Text als auch die Tabelle als gerenderte Grafik enthalten ist.

Jetzt bemühe ich mich den Text und die Tabelle in ein QTextDocument einzufügen. Mit dem Text hab ich kein Problem. Nur bei der Tabelle kapier ich nicht, wie ich die in das QTextDocument einfügen kann. :(

Vielleicht kann mir mal jemand auf die Sprünge helfen. :wink:
Mit freundlichem Gruß Klaus

Das Geheimnis des Könnens liegt im Wollen!
Ubuntu 9.10 64Bit, AMD Athlon 64/Opteron 3200+, 1GB RAM, NVIDIA GeForce7, 250GB SATA 80GB USB und Asus Eee PC 4G mit Ubuntu-eee-8.04.1\\
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

Die komplette Seite samt Begleittext in HTML packen?
Also z.B.:

Code: Alles auswählen

pg = ""
pg += "Das ist der <i>Begleittext</i>"
# usw.
row = 0
while row < table.rowCount():
    pg += "<tr>"
    col = 0
    while col < table.columnCount():
        pg += "<td>"
        item = table.item(row, col)
        if item:
            pg += item.data(Qt.DisplayRole)
        col += 1
        pg += "</td>"
    row += 1
    pg += "</tr>"
pg += "</table"
doc = QTextDocument()
doc.setHtml(pg)
So in etwa dachte ich mir das.
Ansonsten kannst du auch den schwereren Weg gehen und alles Daten selber in Pixmaps rendern, die du dann millimetergenau auf deinem Drucker platzieren kannst.

Oder du malst mit nem Painter direkt auf den Printer (QPrinter ist auch nur ein QPaintDevice, welches du einem QPainter.begin() mitgeben kannst). Ist die umständlichste Lösung, aber wohl die mit den bestmöglichen Resultaten.
Ene Uran
User
Beiträge: 125
Registriert: Sonntag 17. September 2006, 20:14
Wohnort: Hollywood

Hier is ein kleines Beispiel, was so wenigstens die HTML Code betrifft:

Code: Alles auswählen

# PyQT's QLabel widget can display html formatted text
# used here to display data in a nice table
# tested with Python 3.1.1 and PyQT 4.5.2
# ene

from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MyForm(QWidget):
    def __init__(self, html_table):
        QWidget.__init__(self)
        # setGeometry(x_pos, y_pos, width, height)
        # widget will expand to fit lable size
        self.setGeometry(100, 150, 1, 1)
        self.setWindowTitle("html formatted data table")

        label = QLabel(html_table)

        # use the grid layout manager
        grid = QGridLayout()
        # addWidget(widget, row, column, rowSpan=1, columnSpan=1)
        grid.addWidget(label, 0, 0)
        self.setLayout(grid)


def make_html_table(data_list):
    """
    use a list of data tuples and create the html code
    of a html formatted table containing the data items
    """
    rows = len(data_list)
    columns = len(data_list[0])
    # color is in hex format "#RRGGBB"
    html = '<table border="5" bordercolor="#0000cc" cellspacing="5" '
    html += 'cellpadding="5" width="5" bgcolor="#ffff66">\n'
    for row in range(rows):
        html += '<tr>\n'
        for col in range(columns):
            item = data_list[row][col]
            html += "    %s%s%s\n" % ('<td>', item, '</td>')
        html += '</tr>\n'
    html += '</table>\n'
    return html


# a list of (name, age, weight) tuples
# the first tuple is the header
data_list = [
('Name', 'Age', 'Weight'),
('Heidi Kalumpa', '36', '127'),
('Frank Maruco', '27', '234'),
('Larry Pestraus', '19', '315'),
('Serge Romanowski', '59', '147'),
('Carolus Arm', '94', '102'),
('Michel Sargnagel', '21', '175')
]

html_table = make_html_table(data_list)

#print(html_table)  # for test only

app =  QApplication([])
form = MyForm(html_table)
form.show()
app.exec_()

Atomkraftwerkaktienbesitzer
Benutzeravatar
klaus66
User
Beiträge: 51
Registriert: Mittwoch 11. März 2009, 09:26
Wohnort: Bergisch Gladbach-Bensberg

Erstmal vielen Dank für Eure Hilfe und Anregungen.

Ich befinde mich noch in der Testphase mit PlainText und Formatstrings, weil alles andere nicht so geklappt hat, wie ich es mir vorstelle.
Das ist ein mühseeliges Geschäft, eine Art Erbsenzählerei!
Aber es scheint jetzt hinzuhauen und ist im Grunde vom Programm her die simpelste Lösung, wenn auch nicht die eleganteste. :wink:
Mit freundlichem Gruß Klaus

Das Geheimnis des Könnens liegt im Wollen!
Ubuntu 9.10 64Bit, AMD Athlon 64/Opteron 3200+, 1GB RAM, NVIDIA GeForce7, 250GB SATA 80GB USB und Asus Eee PC 4G mit Ubuntu-eee-8.04.1\\
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

Hallo,
hab so ein ähnliches Problem. Nur das ich schon meine Tabelle im richtigen Format habe. Ich weiß jetzt nur nicht wie man texte, tabelle und/oder ect. überhaupt drucken kann.
Kann mir da jemand helfen?

Liebe Grüße
microkernel.
Antworten