PyQt5 - Exit Code beim ausdrucken der QTableWidget-Tabelle

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Mady
User
Beiträge: 7
Registriert: Mittwoch 17. Oktober 2018, 20:38

Guten morgen,

ich habe eine Destopanwendung in Python 3.6 mit PyQt5 und QTableWidget programmiert.
In meiner QTableWidget -Tabelle sollen zuvor generierte Daten dargestellt (in meinem Code habe ich diese jetzt zur Veranschaulichung direkt eingegeben) werden. Der Nutzer soll weitere Anpassungen an der Tabelle vornehmen können und das Ergebnis (die QTableWidget-Tabelle) anschließend ausdrucken können. Leider erhalte ich sobald auf das Drucksymbol oder auch Druckvorschau gedrückt wird

Code: Alles auswählen

Process finished with exit code -1073740791 (0xC0000409)
und ich finde leider dass Problem nicht.

Hier mein Code, ich würde mich sehr freuen, wenn mir jemand von euch helfen kann.

Code: Alles auswählen

from PyQt5 import QtWidgets, QtCore, QtPrintSupport, QtGui
from PyQt5.QtWidgets import QTableWidgetItem
import sys

from PyQt5.QtWidgets import *

list_a =['word_a 1', 'word_a 2']
list_b =['word_b 1 ', 'word_b 2']
list_c =['word_c 1', 'word_c 2']
combo_box_options = ["Option 1","Option 2","Option 3"]
list_d = ['gut','schlecht']
data = {'Wort A':list_a, 'Wort B':list_b, 'Wort C': list_c, 'Dropdown': [], 'Word D': list_d}


class Window(QTabWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        super().__init__()
        self.setWindowTitle(self.tr('Document Printer'))
        self.table = QtWidgets.QTableWidget()
        self.table.setRowCount(5)
        self.table.setColumnCount(5)

        horHeaders = []
        for col, key in enumerate(sorted(data.keys())):
            horHeaders.append(key)
            for row, item in enumerate(data[key]):
                newitem = QTableWidgetItem(item)
                newitem.setTextAlignment(QtCore.Qt.AlignCenter)
                self.table.setItem(row, col, newitem)
      #      print(newitem.text())
      #  print(horHeaders)


        combo_attr = ['Schlechtes Wort', 'Gefällt niemand', 'Sehr gut', 'Löschen']
        i = 0
        for j in horHeaders:
            comboBox = QtWidgets.QComboBox()
            for t in combo_attr:
                comboBox.addItem(t)
            self.table.setCellWidget(i,3,comboBox)
            i += 1


        self.table.setHorizontalHeaderLabels(
            'Wort A|Wort B|Wort C|Dropdown|Wort D'.split('|'))
        self.buttonPrint = QtWidgets.QPushButton('Print', self)
        self.buttonPrint.clicked.connect(self.handlePrint)
        self.buttonPreview = QtWidgets.QPushButton('Preview', self)
        self.buttonPreview.clicked.connect(self.handlePreview)
        layout = QtWidgets.QGridLayout(self)
        layout.addWidget(self.table, 0, 0, 1, 2)
        layout.addWidget(self.buttonPrint, 1, 0)
        layout.addWidget(self.buttonPreview, 1, 1)

    def handlePrint(self):
        dialog = QtPrintSupport.QPrintDialog()
        if dialog.exec_() == QtWidgets.QDialog.Accepted:
            self.handlePaintRequest(dialog.printer())

    def handlePreview(self):
        dialog = QtPrintSupport.QPrintPreviewDialog()
        dialog.paintRequested.connect(self.handlePaintRequest)
        dialog.exec_()

    def handlePaintRequest(self, printer):
        document = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(document)
        table = cursor.insertTable(
            self.table.rowCount(), self.table.columnCount())

        for row in range(table.rows()):
            print(row)
            for col in range(table.columns()):
                print(col)
                cursor.insertText(self.table.newitem(row, col).text())
                cursor.movePosition(QtGui.QTextCursor.NextCell)
        document.print_(printer)




if __name__ == '__main__':

    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.resize(640, 480)
    window.show()
    sys.exit(app.exec_())
__deets__
User
Beiträge: 14533
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist ein harter Absturz in C++. Wenn du ihn hast, kannst du ihn mit WinDBG oder ähnlichen zu Leibe rücken.

Ansonsten würde ich das Textdokument erstmal versuchen leer zu drucken, und schauen, ob Dinge, die du hinzufügst da einen Unterschied machen.
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

Keine Ahnung, was damit alles kaputt geht, aber man sollte niemals zweimal __init__ aufrufen.

Zudem: `horHeaders` enthält ja das selbe wie die Schlüssel von `data` wird dann aber gar nicht benutzt, sondern nur zum Zählen. Warum integrierst Du die zweite for-Schleife nicht in die erste.
Die ganze Datenaufbereitung ist verbesserungswürdig. An verschiedenen Stellen stehen die Spaltenüberschriften im Code, mal als Schlüssel, mal als String. Das führt nur dazu, dass man alles konsistent halten muß und leicht Fehler macht.
Dann hast Du drei parallele Listen, die jeweils am selben Index zusammengehörige Daten speichern, das muß man wiederum mit großen Aufwand konsistent halten.
i, j, t sind einbuchstabe Variablennamen, die nichts aussagen.

Code: Alles auswählen

WordWhatever = namedtuple("WordWhatever", "word_a", "word_b", "word_c", "word_d")

data = [
    WordWhatever('word_a1', 'word_b1', 'word_c1', 'gut'),
    WordWhatever('word_a2', 'word_b2', 'word_c2', 'schlecht'),
]

class Window(QTabWidget):
    WORD_OPTIONS = ['Schlechtes Wort', 'Gefällt niemand', 'Sehr gut', 'Löschen']
    TABLE_HEADERS = 'Wort A|Wort B|Wort C|Dropdown|Wort D'.split('|')

    def __init__(self):
        super().__init__()
        self.setWindowTitle(self.tr('Document Printer'))
        self.table = QtWidgets.QTableWidget()
        self.table.setRowCount(5)
        self.table.setColumnCount(5)
        self.table.setHorizontalHeaderLabels(self.TABLE_HEADERS)
        for idx, row in enumerate(data):
            newitem = QTableWidgetItem(row.word_a)
            newitem.setTextAlignment(QtCore.Qt.AlignCenter)
            self.table.setItem(idx, 0, newitem)
            newitem = QTableWidgetItem(row.word_b)
            newitem.setTextAlignment(QtCore.Qt.AlignCenter)
            self.table.setItem(idx, 1, newitem)
            newitem = QTableWidgetItem(row.word_c)
            newitem.setTextAlignment(QtCore.Qt.AlignCenter)
            self.table.setItem(idx, 2, newitem)
            comboBox = QtWidgets.QComboBox()
            comboBox.addItems(self.WORD_OPTIONS)
            self.table.setCellWidget(i,3,comboBox)
            newitem = QTableWidgetItem(row.word_d)
            newitem.setTextAlignment(QtCore.Qt.AlignCenter)
            self.table.setItem(idx, 4, newitem)

        self.button_print = QtWidgets.QPushButton('Print', self)
        self.button_print.clicked.connect(self.handle_print)
        self.button_preview = QtWidgets.QPushButton('Preview', self)
        self.button_preview.clicked.connect(self.handle_preview)
        layout = QtWidgets.QGridLayout(self)
        layout.addWidget(self.table, 0, 0, 1, 2)
        layout.addWidget(self.button_print, 1, 0)
        layout.addWidget(self.button_preview, 1, 1)
Antworten