web-dev-qa-db-fra.com

Exemple PySide + QTableView

Quelqu'un peut-il m'indiquer un exemple simple de QTableView dans PySide?

J'ai trouvé les QTableView docs mais malheureusement, ils ne donnent pas d'exemple, et je suis très novice dans PySide, donc je ne sais même pas comment commencer. (Je connais très bien JTable dans Java Swing, je sais donc comment utiliser les modèles de table.)

13
Jason S

Trouvé un:

http://www.daniweb.com/software-development/python/code/447834/applying-pysides-qabstracttablemodel

''' ps_QAbstractTableModel_solvents.py
use PySide's QTableView and QAbstractTableModel for tabular data
sort columns by clicking on the header title
here applied to solvents commonly used in Chemistry
PySide is the official LGPL-licensed version of PyQT
tested with PySide112 and Python27/Python33 by vegaseat  15feb2013
'''
import operator
from PySide.QtCore import *
from PySide.QtGui import *
class MyWindow(QWidget):
    def __init__(self, data_list, header, *args):
        QWidget.__init__(self, *args)
        # setGeometry(x_pos, y_pos, width, height)
        self.setGeometry(300, 200, 570, 450)
        self.setWindowTitle("Click on column title to sort")
        table_model = MyTableModel(self, data_list, header)
        table_view = QTableView()
        table_view.setModel(table_model)
        # set font
        font = QFont("Courier New", 14)
        table_view.setFont(font)
        # set column width to fit contents (set font first!)
        table_view.resizeColumnsToContents()
        # enable sorting
        table_view.setSortingEnabled(True)
        layout = QVBoxLayout(self)
        layout.addWidget(table_view)
        self.setLayout(layout)
class MyTableModel(QAbstractTableModel):
    def __init__(self, parent, mylist, header, *args):
        QAbstractTableModel.__init__(self, parent, *args)
        self.mylist = mylist
        self.header = header
    def rowCount(self, parent):
        return len(self.mylist)
    def columnCount(self, parent):
        return len(self.mylist[0])
    def data(self, index, role):
        if not index.isValid():
            return None
        Elif role != Qt.DisplayRole:
            return None
        return self.mylist[index.row()][index.column()]
    def headerData(self, col, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self.header[col]
        return None
    def sort(self, col, order):
        """sort table by given column number col"""
        self.emit(SIGNAL("layoutAboutToBeChanged()"))
        self.mylist = sorted(self.mylist,
            key=operator.itemgetter(col))
        if order == Qt.DescendingOrder:
            self.mylist.reverse()
        self.emit(SIGNAL("layoutChanged()"))
# the solvent data ...
header = ['Solvent Name', ' BP (deg C)', ' MP (deg C)', ' Density (g/ml)']
# use numbers for numeric data to sort properly
data_list = [
('ACETIC ACID', 117.9, 16.7, 1.049),
('ACETIC ANHYDRIDE', 140.1, -73.1, 1.087),
('ACETONE', 56.3, -94.7, 0.791),
('ACETONITRILE', 81.6, -43.8, 0.786),
('ANISOLE', 154.2, -37.0, 0.995),
('BENZYL ALCOHOL', 205.4, -15.3, 1.045),
('BENZYL BENZOATE', 323.5, 19.4, 1.112),
('BUTYL ALCOHOL NORMAL', 117.7, -88.6, 0.81),
('BUTYL ALCOHOL SEC', 99.6, -114.7, 0.805),
('BUTYL ALCOHOL TERTIARY', 82.2, 25.5, 0.786),
('CHLOROBENZENE', 131.7, -45.6, 1.111),
('CYCLOHEXANE', 80.7, 6.6, 0.779),
('CYCLOHEXANOL', 161.1, 25.1, 0.971),
('CYCLOHEXANONE', 155.2, -47.0, 0.947),
('DICHLOROETHANE 1 2', 83.5, -35.7, 1.246),
('DICHLOROMETHANE', 39.8, -95.1, 1.325),
('DIETHYL ETHER', 34.5, -116.2, 0.715),
('DIMETHYLACETAMIDE', 166.1, -20.0, 0.937),
('DIMETHYLFORMAMIDE', 153.3, -60.4, 0.944),
('DIMETHYLSULFOXIDE', 189.4, 18.5, 1.102),
('DIOXANE 1 4', 101.3, 11.8, 1.034),
('DIPHENYL ETHER', 258.3, 26.9, 1.066),
('ETHYL ACETATE', 77.1, -83.9, 0.902),
('ETHYL ALCOHOL', 78.3, -114.1, 0.789),
('ETHYL DIGLYME', 188.2, -45.0, 0.906),
('ETHYLENE CARBONATE', 248.3, 36.4, 1.321),
('ETHYLENE GLYCOL', 197.3, -13.2, 1.114),
('FORMIC ACID', 100.6, 8.3, 1.22),
('HEPTANE', 98.4, -90.6, 0.684),
('HEXAMETHYL PHOSPHORAMIDE', 233.2, 7.2, 1.027),
('HEXANE', 68.7, -95.3, 0.659),
('ISO OCTANE', 99.2, -107.4, 0.692),
('ISOPROPYL ACETATE', 88.6, -73.4, 0.872),
('ISOPROPYL ALCOHOL', 82.3, -88.0, 0.785),
('METHYL ALCOHOL', 64.7, -97.7, 0.791),
('METHYL ETHYLKETONE', 79.6, -86.7, 0.805),
('METHYL ISOBUTYL KETONE', 116.5, -84.0, 0.798),
('METHYL T-BUTYL ETHER', 55.5, -10.0, 0.74),
('METHYLPYRROLIDINONE N', 203.2, -23.5, 1.027),
('MORPHOLINE', 128.9, -3.1, 1.0),
('NITROBENZENE', 210.8, 5.7, 1.208),
('NITROMETHANE', 101.2, -28.5, 1.131),
('PENTANE', 36.1, ' -129.7', 0.626),
('PHENOL', 181.8, 40.9, 1.066),
('PROPANENITRILE', 97.1, -92.8, 0.782),
('PROPIONIC ACID', 141.1, -20.7, 0.993),
('PROPIONITRILE', 97.4, -92.8, 0.782),
('PROPYLENE GLYCOL', 187.6, -60.1, 1.04),
('PYRIDINE', 115.4, -41.6, 0.978),
('SULFOLANE', 287.3, 28.5, 1.262),
('TETRAHYDROFURAN', 66.2, -108.5, 0.887),
('TOLUENE', 110.6, -94.9, 0.867),
('TRIETHYL PHOSPHATE', 215.4, -56.4, 1.072),
('TRIETHYLAMINE', 89.5, -114.7, 0.726),
('TRIFLUOROACETIC ACID', 71.8, -15.3, 1.489),
('WATER', 100.0, 0.0, 1.0),
('XYLENES', 139.1, -47.8, 0.86)
]
app = QApplication([])
win = MyWindow(data_list, header)
win.show()
app.exec_()
22
Jason S

Voici l'exemple de code Pyside2

Même exemple de @Jason S. J'ai apporté des modifications pour une exécution en Python3 avec PySide2

import operator
from PySide2 import QtWidgets
from PySide2 import QtGui
from PySide2 import QtCore


class MyWindow(QtWidgets.QWidget):
    def __init__(self, data_list, header, *args):
        QtWidgets.QWidget.__init__(self, *args)
        # setGeometry(x_pos, y_pos, width, height)
        self.setGeometry(300, 200, 570, 450)
        self.setWindowTitle("Click on column title to sort")
        table_model = MyTableModel(self, data_list, header)
        table_view = QtWidgets.QTableView()
        table_view.setModel(table_model)
        # set font
        font = QtGui.QFont("Courier New", 14)
        table_view.setFont(font)
        # set column width to fit contents (set font first!)
        table_view.resizeColumnsToContents()
        # enable sorting
        table_view.setSortingEnabled(True)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(table_view)
        self.setLayout(layout)


class MyTableModel(QtCore.QAbstractTableModel):
    def __init__(self, parent, mylist, header, *args):
        QtCore.QAbstractTableModel.__init__(self, parent, *args)
        self.mylist = mylist
        self.header = header

    def rowCount(self, parent):
        return len(self.mylist)

    def columnCount(self, parent):
        return len(self.mylist[0])

    def data(self, index, role):
        if not index.isValid():
            return None
        Elif role != QtCore.Qt.DisplayRole:
            return None
        return self.mylist[index.row()][index.column()]

    def headerData(self, col, orientation, role):
        if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole:
            return self.header[col]
        return None

    def sort(self, col, order):
        """sort table by given column number col"""
        self.emit(QtCore.SIGNAL("layoutAboutToBeChanged()"))
        self.mylist = sorted(self.mylist,
                             key=operator.itemgetter(col))
        if order == QtCore.Qt.DescendingOrder:
            self.mylist.reverse()
        self.emit(QtCore.SIGNAL("layoutChanged()"))


# the solvent data ...
header = ['Solvent Name', ' BP (deg C)', ' MP (deg C)', ' Density (g/ml)']
# use numbers for numeric data to sort properly
data_list = [
    ('ACETIC ACID', 117.9, 16.7, 1.049),
    ('ACETIC ANHYDRIDE', 140.1, -73.1, 1.087),
    ('ACETONE', 56.3, -94.7, 0.791),
    ('ACETONITRILE', 81.6, -43.8, 0.786),
    ('ANISOLE', 154.2, -37.0, 0.995),
    ('BENZYL ALCOHOL', 205.4, -15.3, 1.045),
    ('BENZYL BENZOATE', 323.5, 19.4, 1.112),
    ('BUTYL ALCOHOL NORMAL', 117.7, -88.6, 0.81),
    ('BUTYL ALCOHOL SEC', 99.6, -114.7, 0.805),
    ('BUTYL ALCOHOL TERTIARY', 82.2, 25.5, 0.786),
    ('CHLOROBENZENE', 131.7, -45.6, 1.111),
    ('CYCLOHEXANE', 80.7, 6.6, 0.779),
    ('CYCLOHEXANOL', 161.1, 25.1, 0.971),
    ('CYCLOHEXANONE', 155.2, -47.0, 0.947),
    ('DICHLOROETHANE 1 2', 83.5, -35.7, 1.246),
    ('DICHLOROMETHANE', 39.8, -95.1, 1.325),
    ('DIETHYL ETHER', 34.5, -116.2, 0.715),
    ('DIMETHYLACETAMIDE', 166.1, -20.0, 0.937),
    ('DIMETHYLFORMAMIDE', 153.3, -60.4, 0.944),
    ('DIMETHYLSULFOXIDE', 189.4, 18.5, 1.102),
    ('DIOXANE 1 4', 101.3, 11.8, 1.034),
    ('DIPHENYL ETHER', 258.3, 26.9, 1.066),
    ('ETHYL ACETATE', 77.1, -83.9, 0.902),
    ('ETHYL ALCOHOL', 78.3, -114.1, 0.789),
    ('ETHYL DIGLYME', 188.2, -45.0, 0.906),
    ('ETHYLENE CARBONATE', 248.3, 36.4, 1.321),
    ('ETHYLENE GLYCOL', 197.3, -13.2, 1.114),
    ('FORMIC ACID', 100.6, 8.3, 1.22),
    ('HEPTANE', 98.4, -90.6, 0.684),
    ('HEXAMETHYL PHOSPHORAMIDE', 233.2, 7.2, 1.027),
    ('HEXANE', 68.7, -95.3, 0.659),
    ('ISO OCTANE', 99.2, -107.4, 0.692),
    ('ISOPROPYL ACETATE', 88.6, -73.4, 0.872),
    ('ISOPROPYL ALCOHOL', 82.3, -88.0, 0.785),
    ('METHYL ALCOHOL', 64.7, -97.7, 0.791),
    ('METHYL ETHYLKETONE', 79.6, -86.7, 0.805),
    ('METHYL ISOBUTYL KETONE', 116.5, -84.0, 0.798),
    ('METHYL T-BUTYL ETHER', 55.5, -10.0, 0.74),
    ('METHYLPYRROLIDINONE N', 203.2, -23.5, 1.027),
    ('MORPHOLINE', 128.9, -3.1, 1.0),
    ('NITROBENZENE', 210.8, 5.7, 1.208),
    ('NITROMETHANE', 101.2, -28.5, 1.131),
    ('PENTANE', 36.1, ' -129.7', 0.626),
    ('PHENOL', 181.8, 40.9, 1.066),
    ('PROPANENITRILE', 97.1, -92.8, 0.782),
    ('PROPIONIC ACID', 141.1, -20.7, 0.993),
    ('PROPIONITRILE', 97.4, -92.8, 0.782),
    ('PROPYLENE GLYCOL', 187.6, -60.1, 1.04),
    ('PYRIDINE', 115.4, -41.6, 0.978),
    ('SULFOLANE', 287.3, 28.5, 1.262),
    ('TETRAHYDROFURAN', 66.2, -108.5, 0.887),
    ('TOLUENE', 110.6, -94.9, 0.867),
    ('TRIETHYL PHOSPHATE', 215.4, -56.4, 1.072),
    ('TRIETHYLAMINE', 89.5, -114.7, 0.726),
    ('TRIFLUOROACETIC ACID', 71.8, -15.3, 1.489),
    ('WATER', 100.0, 0.0, 1.0),
    ('XYLENES', 139.1, -47.8, 0.86)
]
app = QtWidgets.QApplication([])
win = MyWindow(data_list, header)
win.show()
app.exec_()
1
Rajiv Sharma