Wie kopiere ich den gesamten Inhalt einer QTableWidget in die Zwischenablage?

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
mad_max_1
User
Beiträge: 2
Registriert: Donnerstag 7. März 2024, 15:41

Hallo zusammen,

ich bin noch relativ neu in der Welt von Python und Qt, und ich arbeite gerade an einem Projekt, bei dem ich eine QTableWidget verwende.

Ich stehe vor der Herausforderung, den gesamten Inhalt dieser Tabelle in die Zwischenablage zu kopieren, um ihn dann in eine MS-Word-Tabelle einzufügen. Auch wenn ich die gesamte Tabelle zuerst markiert habe, gelingt es mir bisher nur, den Inhalt einer einzelnen Zelle zu kopieren.

Da die MS-Word-Formulare relativ umfangreich sind, möchte ich den Inhalt manuell in die Tabelle einfügen. Daher wäre es ideal, wenn ich durch einen Tastendruck den gesamten Inhalt der Tabelle in die Zwischenablage kopieren könnte.

Hat jemand von euch eine Idee, wie ich das machen könnte?

Ich entschuldige mich im Voraus, falls ich nicht alle technischen Begriffe richtig verwende oder nicht alles sofort verstehe. Ich bin noch ein Anfänger und versuche, mir das Programmieren selbst beizubringen.

Vielen Dank im Voraus für eure Hilfe!

Python 3.12 , PyCharm Community Edition 2023.3.4, PyQT6, QT Designer 6.6.2, Win11
mad_max_1
User
Beiträge: 2
Registriert: Donnerstag 7. März 2024, 15:41

Hallo liebe Community

Ich habe einen Lösungsweg gefunden, um den Inhalt einer Tabelle in meiner Anwendung in die Zwischenablage zu kopieren.
Ich verwende den Befehl QApplication.clipboard() zusammen mit anderen Funktionen, um den Tabelleninhalt zu kopieren und in die Zwischenablage zu setzen. Es funktioniert, aber ich bin mir nicht sicher, ob dies der beste Ansatz ist.

Code: Alles auswählen

QApplication.clipboard()
Habt ihr Erfahrungen mit ähnlichen Funktionen gemacht? Gibt es Verbesserungsvorschläge oder mögliche Fehler, die ich übersehen habe?
Ich bin für jegliches Feedback dankbar. Vielen Dank im Voraus!

Hier ist ein vereinfachtes Beispiel, um die Funktionalität zu zeigen:

Code: Alles auswählen

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QTableWidget, QTableWidgetItem, QVBoxLayout, \
    QWidget, QMessageBox


class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Table Widget Example")
        self.setGeometry(300, 200, 600, 400)

        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)

        self.layout = QVBoxLayout(self.central_widget)

        self.table_widget = QTableWidget()
        self.table_widget.setRowCount(5)
        self.table_widget.setColumnCount(3)

        for i in range(5):
            for j in range(3):
                item = QTableWidgetItem(f"Item {i},{j}")
                self.table_widget.setItem(i, j, item)

        self.layout.addWidget(self.table_widget)

        self.copy_button = QPushButton("Tabelle kopieren", self)
        self.copy_button.clicked.connect(self.copy_table_content)
        self.layout.addWidget(self.copy_button)

    def copy_table_content(self):
        table_content = ""
        for row in range(self.table_widget.rowCount()):
            row_data = []
            for column in range(self.table_widget.columnCount()):
                item = self.table_widget.item(row, column)
                row_data.append(item.text() if item is not None else "")
            table_content += "\t".join(row_data) + "\n"

        QApplication.clipboard().setText(table_content)
        QMessageBox.information(self, "Kopiert", "Tabelle erfolgreich in die Zwischenablage kopiert.")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec())
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@mad_max_1: Anmerkungen zum Quelltext:

Die Vorsilbe `My` macht keinen Sinn solange es nicht auch ein `TheirWindow` oder `OurWindow` oder ähnliches gibt.

Es werden unnötig Attribute an das Objekt gebunden und wirklich falsch ist das bei `self.layout`, denn damit verdeckt man dann die `layout()`-Methode die diese Klasse erbt. Andere sind einfach nur redundant, denn `central_widget` erreicht man bereits über die `centralWidget()`-Methode vom `QMainWindow`.

Qt-Properties und Signale kann man schon beim Erstellen von Objekten angeben beziehungsweise verbinden.

Wiederholt Zeichenketten in einer Schleife ”addieren” ist potentiell ineffizient, weil Zeichenketten unveränderbar sind, da also immer mehr und mehr Daten im Speciher kopiert werden müssen. Idiomatisches Python wäre die `join()`-Methode zu verwenden, wie das bereits bei den Zellen einer Zeile gemacht wird.

Code: Alles auswählen

#!/usr/bin/env python3
import sys

from PyQt6.QtWidgets import (
    QApplication,
    QMainWindow,
    QMessageBox,
    QPushButton,
    QTableWidget,
    QTableWidgetItem,
    QVBoxLayout,
    QWidget,
)


class Window(QMainWindow):
    def __init__(self):
        super().__init__(windowTitle="Table Widget Example")
        self.setGeometry(300, 200, 600, 400)

        widget = QWidget()
        self.setCentralWidget(widget)

        layout = QVBoxLayout(widget)

        self.table_widget = QTableWidget(rowCount=5, columnCount=3)
        for i in range(self.table_widget.rowCount()):
            for j in range(self.table_widget.columnCount()):
                self.table_widget.setItem(
                    i, j, QTableWidgetItem(f"Item {i},{j}")
                )
        layout.addWidget(self.table_widget)
        layout.addWidget(
            QPushButton("Tabelle kopieren", clicked=self.copy_table_content)
        )

    def copy_table_content(self):
        QApplication.clipboard().setText(
            "".join(
                "\t".join(
                    item.text() if item else ""
                    for item in (
                        self.table_widget.item(row_index, column_index)
                        for column_index in range(
                            self.table_widget.columnCount()
                        )
                    )
                )
                + "\n"
                for row_index in range(self.table_widget.rowCount())
            )
        )
        QMessageBox.information(
            self,
            "Kopiert",
            "Tabelle erfolgreich in die Zwischenablage kopiert.",
        )


def main():
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec())


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten