Giter VIP home page Giter VIP logo

treeview's Introduction

ListBox_gtk.zip

TreeView C# Gtk Sharp

made with MonoDevelop on Linux

Open and Save CSV (tab delimited)

Qt_CSV.py

CSV (tab delimited) Reader/Writer in Python (Qt4)

QTableView

Qt5_CSV.py

CSV Reader/Writer in Python (Qt5)

QTableView with contextual menu

open and save tab delimited CSV

add / delete Rows, add / delete Columns

print Table

treeview's People

Contributors

axel-erfurt avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

treeview's Issues

Some Corrections for best save after saveas

#!/usr/bin/python3
#-*- coding:utf-8 -*-
import csv, codecs 
import os


from PyQt5 import QtCore, QtGui, QtWidgets, QtPrintSupport
from PyQt5.QtGui import QImage, QPainter
from PyQt5.QtCore import QFile

class MyWindow(QtWidgets.QWidget):
    def __init__(self, aPath, parent=None):
        super(MyWindow, self).__init__(parent)
        self.isChanged = False
        self.fileName = ""
        self.fname = "Liste"
        self.model =  QtGui.QStandardItemModel(self)

        self.tableView = QtWidgets.QTableView(self)
        self.tableView.setStyleSheet(stylesheet(self))
        self.tableView.setModel(self.model)
        self.tableView.horizontalHeader().setStretchLastSection(True)
        self.tableView.setShowGrid(True)
        self.tableView.setGeometry(10, 50, 780, 645)
        self.tableView.verticalHeader().setSectionResizeMode(3)
        self.model.dataChanged.connect(self.finishedEdit)

        self.pushButtonLoad = QtWidgets.QPushButton(self)
        self.pushButtonLoad.setText("Load CSV")
        self.pushButtonLoad.clicked.connect(self.loadCsv)
        self.pushButtonLoad.setFixedWidth(60)
        self.pushButtonLoad.setStyleSheet(stylesheet(self))

        self.pushButtonWrite = QtWidgets.QPushButton(self)
        self.pushButtonWrite.setText("Save")
        self.pushButtonWrite.clicked.connect(self.saveOnQuit)
        self.pushButtonWrite.setFixedWidth(60)
        self.pushButtonWrite.setStyleSheet(stylesheet(self))

        self.pushButtonWrite2 = QtWidgets.QPushButton(self)
        self.pushButtonWrite2.setText("Save as ...")
        self.pushButtonWrite2.clicked.connect(self.writeCsv)
        self.pushButtonWrite2.setFixedWidth(60)
        self.pushButtonWrite2.setStyleSheet(stylesheet(self))

        self.pushButtonPreview = QtWidgets.QPushButton(self)
        self.pushButtonPreview.setText("Print Preview")
        self.pushButtonPreview.clicked.connect(self.handlePreview)
        self.pushButtonPreview.setFixedWidth(80)
        self.pushButtonPreview.setStyleSheet(stylesheet(self))

        self.pushButtonPrint = QtWidgets.QPushButton(self)
        self.pushButtonPrint.setText("Print")
        self.pushButtonPrint.clicked.connect(self.handlePrint)
        self.pushButtonPrint.setFixedWidth(60)
        self.pushButtonPrint.setStyleSheet(stylesheet(self))

        self.pushAddRow = QtWidgets.QPushButton(self)
        self.pushAddRow.setText("add Row")
        self.pushAddRow.clicked.connect(self.addRow)
        self.pushAddRow.setFixedWidth(60)
        self.pushAddRow.setStyleSheet(stylesheet(self))

        self.pushDeleteRow = QtWidgets.QPushButton(self)
        self.pushDeleteRow.setText("delete Row")
        self.pushDeleteRow.clicked.connect(self.removeRow)
        self.pushDeleteRow.setFixedWidth(70)
        self.pushDeleteRow.setStyleSheet(stylesheet(self))

        self.pushAddColumn = QtWidgets.QPushButton(self)
        self.pushAddColumn.setText("add Column")
        self.pushAddColumn.clicked.connect(self.addColumn)
        self.pushAddColumn.setFixedWidth(80)
        self.pushAddColumn.setStyleSheet(stylesheet(self))

        self.pushDeleteColumn = QtWidgets.QPushButton(self)
        self.pushDeleteColumn.setText("delete Column")
        self.pushDeleteColumn.clicked.connect(self.removeColumn)
        self.pushDeleteColumn.setFixedWidth(86)
        self.pushDeleteColumn.setStyleSheet(stylesheet(self))

        self.pushClear = QtWidgets.QPushButton(self)
        self.pushClear.setText("Clear")
        self.pushClear.clicked.connect(self.clearList)
        self.pushClear.setFixedWidth(60)
        self.pushClear.setStyleSheet(stylesheet(self))

        grid = QtWidgets.QGridLayout()
        grid.setSpacing(10)
        grid.addWidget(self.pushButtonLoad, 0, 0)
        grid.addWidget(self.pushButtonWrite, 0, 1)
        grid.addWidget(self.pushButtonWrite2, 0, 2)
        grid.addWidget(self.pushAddRow, 0, 3)
        grid.addWidget(self.pushDeleteRow, 0, 4)
        grid.addWidget(self.pushAddColumn, 0, 5)
        grid.addWidget(self.pushDeleteColumn, 0, 6)
        grid.addWidget(self.pushClear, 0, 7)
        grid.addWidget(self.pushButtonPreview, 0, 8)
        grid.addWidget(self.pushButtonPrint, 0, 9, 1, 1, QtCore.Qt.AlignRight)
        grid.addWidget(self.tableView, 1, 0, 1, 10)
        self.setLayout(grid)

        item = QtGui.QStandardItem()
        self.model.appendRow(item)
        self.model.setData(self.model.index(0, 0), "", 0)
        self.tableView.resizeColumnsToContents()
        self.isChanged = False

        print("Welcome to CSV Reader")

        #if len(sys.argv) > 2:
        #    print("liste argument")
        #    print(sys.argv[1])
        #    self.fileName = sys.argv[1]
        #    self.loadCsvOnOpen(self.fileName)
        #    print(self.fileName + "loaded")
        #else:
        #    print("no File")

    def loadCsvOnOpen(self, fileName):
        if fileName:
            print(fileName + " chargée")
            font = QtGui.QFont()
            font.setBold(True)
            ff = open(fileName, 'r',  encoding="utf-8")
            mytext = ff.read()
            ff.close()
            f = open(fileName, 'r', encoding="utf-8")
            with f:
                i = int(1)
                self.fileName = fileName
                # root and ext pair
                root_ext = os.path.splitext(fileName)
                explos = os.path.splitext(str(fileName))[0].split("/")
                print("explos=>" )
                print(explos)
                self.repertoire=os.path.join('C:\\', *explos[0:-1])


                # print root and ext
                # of the specified path
                print("ici part of '% s':" % fileName, root_ext[0:-2])
                print("ext part of '% s':" % fileName, root_ext[1])
                
                self.fname = os.path.splitext(str(fileName))[0].split("/")[-1]
                self.setWindowTitle("Nom du fichier en cours =>" + self.fname)
                if mytext.count(';') <= mytext.count('\t'):
                    reader = csv.reader(f, delimiter = '\t')
                    self.model.clear()
                    for row in reader:    
                        items = [QtGui.QStandardItem(field) for field in row]
                        self.model.appendRow(items)
                        self.model.setHeaderData(i - 1, QtCore.Qt.Horizontal, "Column " + str(i))
                        i = i + 1
                else:
                    reader = csv.reader(f, delimiter = ';')
                    self.model.clear()
                    for row in reader:    
                        items = [QtGui.QStandardItem(field) for field in row]
                        self.model.appendRow(items)
                        self.model.setHeaderData(i - 1, QtCore.Qt.Horizontal, "Column " + str(i))

                        i = i + 1
                self.tableView.selectRow(0)

                self.tableView.resizeColumnsToContents()
                self.isChanged = False

    def loadCsv(self, fileName):
        fileName, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Open CSV",
                (QtCore.QDir.homePath() + "/Documents/CSV"), "CSV (*.csv *.tsv *.txt)")
        if fileName:
            self.loadCsvOnOpen(fileName)
            self.fileName = fileName

    def writeCsv(self):
        # find empty cells
        for row in range(self.model.rowCount()):
            for column in range(self.model.columnCount()):
                myitem = self.model.item(row,column)
                if myitem is None:
                    item = QtGui.QStandardItem("")
                    self.model.setItem(row, column, item)
        fileName, _ = QtWidgets.QFileDialog.getSaveFileName(self, "Save File", 
                        (QtCore.QDir.homePath() + "/Documents/CSV/" + self.fname + ".csv"),"CSV Files (*.csv)")
        if fileName:
            print("fichier ouvert:" + fileName)
            f = open(fileName, 'w', encoding='utf-8',  newline='')
            with f:
                writer = csv.writer(f, delimiter = ';')
                for rowNumber in range(self.model.rowCount()):
                    fields = [self.model.data(self.model.index(rowNumber, columnNumber),
                                        QtCore.Qt.DisplayRole)
                    for columnNumber in range(self.model.columnCount())]
                    writer.writerow(fields)
                self.fname = os.path.splitext(str(fileName))[0].split("/")[-1]
                self.setWindowTitle("Nom du fichier en cours =>" + self.fname)
                self.fileName = self.fname
                self.isChanged = False

    def handlePrint(self):
        if self.model.rowCount() == 0:
            print("no rows")
        else:
            dialog = QtPrintSupport.QPrintDialog()
            if dialog.exec_() == QtWidgets.QDialog.Accepted:
                self.handlePaintRequest(dialog.printer())
                print("Document printed")

    def handlePreview(self):
        if self.model.rowCount() == 0:
            print("no rows")
        else:
            dialog = QtPrintSupport.QPrintPreviewDialog()
            dialog.setFixedSize(1000,700)
            dialog.paintRequested.connect(self.handlePaintRequest)
            dialog.exec_()
            print("Print Preview closed")

    def handlePaintRequest(self, printer):
        # find empty cells
        for row in range(self.model.rowCount()):
            for column in range(self.model.columnCount()):
                myitem = self.model.item(row,column)
                if myitem is None:
                    item = QtGui.QStandardItem("")
                    self.model.setItem(row, column, item)
        printer.setDocName(self.fname)
        document = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(document)
        model = self.tableView.model()
        tableFormat = QtGui.QTextTableFormat()
        tableFormat.setBorder(0.2)
        tableFormat.setBorderStyle(3)
        tableFormat.setCellSpacing(0);
        tableFormat.setTopMargin(0);
        tableFormat.setCellPadding(4)
        table = cursor.insertTable(model.rowCount(), model.columnCount(), tableFormat)
        print(self.model.horizontalHeaderItem(0).text())
        for row in range(table.rows()):
            for column in range(table.columns()):
                cursor.insertText(model.item(row, column).text())
                cursor.movePosition(QtGui.QTextCursor.NextCell)
        document.print_(printer)

    def removeRow(self):
        model = self.model
        indices = self.tableView.selectionModel().selectedRows() 
        for index in sorted(indices):
            model.removeRow(index.row())
            self.isChanged = True

    def addRow(self):
        item = QtGui.QStandardItem("")
        self.model.appendRow(item)
        self.isChanged = True

    def clearList(self):
        self.model.clear()
        self.isChanged = True

    def removeColumn(self):
        model = self.model
        indices = self.tableView.selectionModel().selectedColumns() 
        for index in sorted(indices):
            model.removeColumn(index.column())
            self.isChanged = True

    def addColumn(self):
        count = self.model.columnCount()
        print (count)
        self.model.setColumnCount(count + 1)
        self.model.setData(self.model.index(0, count), "", 0)
        self.tableView.resizeColumnsToContents()
        self.isChanged = True

    def finishedEdit(self):
        self.tableView.resizeColumnsToContents()
        self.isChanged = True

    def contextMenuEvent(self, event):
        self.menu = QtWidgets.QMenu(self)
        # copy
        copyAction = QtWidgets.QAction('Copy', self)
        copyAction.triggered.connect(lambda: self.copyByContext(event))
        # paste
        pasteAction = QtWidgets.QAction('Paste', self)
        pasteAction.triggered.connect(lambda: self.pasteByContext(event))
        # cut
        cutAction = QtWidgets.QAction('Cut', self)
        cutAction.triggered.connect(lambda: self.cutByContext(event))
        # delete selected Row
        removeAction = QtWidgets.QAction('delete Row', self)
        removeAction.triggered.connect(lambda: self.deleteRowByContext(event))
        # add Row after
        addAction = QtWidgets.QAction('insert new Row after', self)
        addAction.triggered.connect(lambda: self.addRowByContext(event))
        # add Row before
        addAction2 = QtWidgets.QAction('insert new Row before', self)
        addAction2.triggered.connect(lambda: self.addRowByContext2(event))
        # add Column before
        addColumnBeforeAction = QtWidgets.QAction('insert new Column before', self)
        addColumnBeforeAction.triggered.connect(lambda: self.addColumnBeforeByContext(event))
        # add Column after
        addColumnAfterAction = QtWidgets.QAction('insert new Column after', self)
        addColumnAfterAction.triggered.connect(lambda: self.addColumnAfterByContext(event))
        # delete Column
        deleteColumnAction = QtWidgets.QAction('delete Column', self)
        deleteColumnAction.triggered.connect(lambda: self.deleteColumnByContext(event))
        # add other required actions
        self.menu.addAction(copyAction)
        self.menu.addAction(pasteAction)
        self.menu.addAction(cutAction)
        self.menu.addSeparator()
        self.menu.addAction(addAction)
        self.menu.addAction(addAction2)
        self.menu.addSeparator()
        self.menu.addAction(addColumnBeforeAction)
        self.menu.addAction(addColumnAfterAction)
        self.menu.addSeparator()
        self.menu.addAction(removeAction)
        self.menu.addAction(deleteColumnAction)
        self.menu.popup(QtGui.QCursor.pos())

    def deleteRowByContext(self, event):
        for i in self.tableView.selectionModel().selection().indexes():
            row = i.row()
            self.model.removeRow(row)
            print("Row " + str(row) + " deleted")
            self.tableView.selectRow(row)
            self.isChanged = True

    def addRowByContext(self, event):
        for i in self.tableView.selectionModel().selection().indexes():
            row = i.row() + 1
            self.model.insertRow(row)
            print("Row at " + str(row) + " inserted")
            self.tableView.selectRow(row)
            self.isChanged = True

    def addRowByContext2(self, event):
        for i in self.tableView.selectionModel().selection().indexes():
            row = i.row()
            self.model.insertRow(row)
            print("Row at " + str(row) + " inserted")
            self.tableView.selectRow(row)
            self.isChanged = True

    def addColumnBeforeByContext(self, event):
        for i in self.tableView.selectionModel().selection().indexes():
            col = i.column()
            self.model.insertColumn(col)
            print("Column at " + str(col) + " inserted")
            self.isChanged = True

    def addColumnAfterByContext(self, event):
        for i in self.tableView.selectionModel().selection().indexes():
            col = i.column() + 1
            self.model.insertColumn(col)
            print("Column at " + str(col) + " inserted")
            self.isChanged = True

    def deleteColumnByContext(self, event):
        for i in self.tableView.selectionModel().selection().indexes():
            col = i.column()
            self.model.removeColumn(col)
            print("Column at " + str(col) + " removed")
            self.isChanged = True

    def copyByContext(self, event):
        for i in self.tableView.selectionModel().selection().indexes():
            row = i.row()
            col = i.column()
            myitem = self.model.item(row,col)
            if myitem is not None:
                clip = QtWidgets.QApplication.clipboard()
                clip.setText(myitem.text())

    def pasteByContext(self, event):
        for i in self.tableView.selectionModel().selection().indexes():
            row = i.row()
            col = i.column()
            myitem = self.model.item(row,col)
            clip = QtWidgets.QApplication.clipboard()
            myitem.setText(clip.text())
            self.isChanged = True

    def cutByContext(self, event):
        for i in self.tableView.selectionModel().selection().indexes():
            row = i.row()
            col = i.column()
            myitem = self.model.item(row,col)
            if myitem is not None:
                clip = QtWidgets.QApplication.clipboard()
                clip.setText(myitem.text())
                myitem.setText("")
                self.isChanged = True

    def closeEvent(self, event):
        if self.isChanged == True:
            quit_msg = "Do you want to save changes?"
            reply = QtWidgets.QMessageBox.question(self, 'Message', 
                     quit_msg, QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)
            if reply == QtWidgets.QMessageBox.Yes:
                event.accept()
                self.saveOnQuit()
                app.quit()
            else:
                app.quit()
        else:
            app.quit()
        print("Goodbye ...")

    def saveOnQuit(self):
        if self.fileName == "":
            
            self.writeCsv()
        else:
             # find empty cells
            for row in range(self.model.rowCount()):
                for column in range(self.model.columnCount()):
                    myitem = self.model.item(row,column)
                    if myitem is None:
                        item = QtGui.QStandardItem("")
                        self.model.setItem(row, column, item)
            self.fileName = self.fileName
            if self.fileName:
                print(self.fileName)
                nom_fichier_long = self.repertoire + "\\" + self.fileName + ".csv"
                f = open(nom_fichier_long, 'w', encoding='utf-8',  newline='')
                with f:
                    writer = csv.writer(f, delimiter = ';')
                    for rowNumber in range(self.model.rowCount()):
                        fields = [self.model.data(self.model.index(rowNumber, columnNumber),
                                            QtCore.Qt.DisplayRole)
                        for columnNumber in range(self.model.columnCount())]
                        print(fields)
                        writer.writerow(fields)
                    self.fileName = os.path.splitext(str(self.fileName))[0].split("/")[-1]
                    self.setWindowTitle("Nom du fichier en cours =>" + self.fileName)
                    self.fileName = self.fileName
                    self.isChanged = False

def stylesheet(self):
        return """
        QTableView
        {
            border: 1px solid grey;
            border-radius: 0px;
            font-family: DroidSans;
            font-size: 11px;
            background-color: #f8f8f8;
            selection-color: #e9e9e9
        }
        QTableView::item:hover
        {   
            color: black;
            background:#CFCA59;            
        }
        
        QTableView::item:selected {
            color: #e9e9e9;
            background: #2F6299;
        } 

        QTableView QTableCornerButton::section {
            background: #D6D1D1;
            border: 1px outset black;
        }

        QPushButton
        {
            font-size: 11px;
        } 

        QPushButton::hover
        {
            font-size: 11px;
            border: 2px inset #353535;
            font-style: oblique;
            font-weight: bold;
            color: #90150A; 
            border-radius: 4px;
            background-color: #C5C5C5;
        } 
    """


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    app.setApplicationName('MyWindow')
    main = MyWindow('')
    main.setMinimumSize(820, 300)
    main.setGeometry(0,0,820,700)
    main.setWindowTitle("CSV Viewer")
    main.show()
    exit(app.exec_())

#Qt5_CSV.py How can we add one column that is QCombobox type to Qtableview after loading csv file?

Hi, I would like to add one column to Qtableview with possibility to choose one of three values like "M", "F", "None" after we load the csv file, how can we integrate this step in loadcsv function?
for example, after we extract data to Qtableview we need to add some information to every row and then we save them.
I've another question, I'm curious to know how we can also add check boxes to every row that will let us to save only selected rows in writecsv function.
Thank you

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.