Pick values by dragging in PyQt5 and store it in a list

Jiro Akira :

I'm making an app using PyQt5 that I can pick values by dragging from 1 position to another position like this image:

enter image description here

All the values were picked will be stored in a list like:

[['4.9', '3.0', '1.4', '0.2'], ['4.7', '3.0', '1.4', '0.2'], .... ['4.4', '2.9', '1.4', '0.2']]

And when I drag to pick the new values, it will create a new list and store all data in that list

Can you guys show me how to implement?

Here is all the code:

import sys, os 
from PyQt5.QtWidgets import (
    QApplication,
    QWidget,
    QTableWidget,
    QTableWidgetItem,
    QVBoxLayout)
from PyQt5.QtGui import QColor

class App(QWidget):

    def __init__(self):
        super().__init__()
        self.setWindowTitle('PyQt5 Table Example')
        self.setGeometry(100, 100, 800, 600)

        # Create a table, create a box layout, add the table to box layout and
        # then set the overall widget layout to the box layout.
        #
        self.createTable()
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.tableWidget) 
        self.setLayout(self.layout) 

        self.show()

    # Create a table with alphabet header labels. We're attempting to mimic
    # the classic spreadsheet look. This goes back to VisiCalc on the Apple ][
    # introduced in 1979.
    #
    def createTable(self):

        self.maxRows = 99
        self.headerLabels = ["A","B","C","D","E","F","G","H","I","J","K","L",
            "M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
        self.tableWidget = QTableWidget()
        self.tableWidget.setRowCount(self.maxRows)
        self.tableWidget.setColumnCount(len(self.headerLabels))
        self.tableWidget.setHorizontalHeaderLabels(self.headerLabels)

        # Pre-populate the cells in the spreadsheets with data, strings in
        # this example.
        #
        for row in range(0, self.maxRows):
            for col in range(0, len(self.headerLabels)):
                self.tableWidget.setItem( row, col,
                    QTableWidgetItem("Cell {0}{1}".format(self.headerLabels[col], row+1)))
                #
                # Set every other row a light green color to help readability.
                #
                # if row % 2 != 0:
                #     self.tableWidget.item(row,col).setBackground(QColor(220,255,220))

        self.tableWidget.move(0,0)

        self.tableWidget.resizeColumnsToContents()
        self.tableWidget.resizeRowsToContents()

        # Hook various events to their respective callbacks.
        #
        self.tableWidget.cellClicked.connect(self.cellClicked)
        self.tableWidget.cellChanged.connect(self.cellChanged)
        self.tableWidget.cellActivated.connect(self.cellActivated)
        self.tableWidget.cellEntered.connect(self.cellEntered)
        self.tableWidget.cellPressed.connect(self.cellPressed)


    def cellClicked(self):
        for currentQTableWidgetItem in self.tableWidget.selectedItems():
            print(' Clicked:', currentQTableWidgetItem.row(),
                  currentQTableWidgetItem.column(),
                  currentQTableWidgetItem.text())

    def cellChanged(self):
        for currentQTableWidgetItem in self.tableWidget.selectedItems():
            print(' Changed:', currentQTableWidgetItem.row(),
                  currentQTableWidgetItem.column(),
                  currentQTableWidgetItem.text())
            list_value.append(currentQTableWidgetItem.text())

        print(list_value)

    def cellActivated(self):
        for currentQTableWidgetItem in self.tableWidget.selectedItems():
            print(' Activated:', currentQTableWidgetItem.row(),
                  currentQTableWidgetItem.column(),
                  currentQTableWidgetItem.text())

            list_value.append(currentQTableWidgetItem.text())

    def cellEntered(self):

        for currentQTableWidgetItem in self.tableWidget.selectedItems():
            print(' Entered:', currentQTableWidgetItem.row(),
                  currentQTableWidgetItem.column(),
                  currentQTableWidgetItem.text())

    def cellPressed(self):
        global list_value
        list_value = []
        for currentQTableWidgetItem in self.tableWidget.selectedItems():
            print('Pressed:', currentQTableWidgetItem.row(),
                  currentQTableWidgetItem.column(),
                  currentQTableWidgetItem.text())
            list_value.append(currentQTableWidgetItem.text())
        print(list_value)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    print('PID',os.getpid())

    sys.exit(app.exec_())

And actually what I got

enter image description here

I'm stucked with button press event, on pick event, on release event

eyllanesc :

You can create a property that is the list of the selected elements that must be modified when the selection that is notified through the itemSelectionChanged signal changes.

import sys

from PyQt5.QtCore import pyqtSlot
from PyQt5.QtGui import QColor
from PyQt5.QtWidgets import (
    QApplication,
    QWidget,
    QTableWidget,
    QTableWidgetItem,
    QVBoxLayout,
)


class App(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyQt5 Table Example")
        self.setGeometry(100, 100, 800, 600)

        self._selected_lists = []

        self.createTable()
        lay = QVBoxLayout(self)
        lay.addWidget(self.tableWidget)

        self.show()

    def createTable(self):

        self.maxRows = 99
        self.headerLabels = [
            "A",
            "B",
            "C",
            "D",
            "E",
            "F",
            "G",
            "H",
            "I",
            "J",
            "K",
            "L",
            "M",
            "N",
            "O",
            "P",
            "Q",
            "R",
            "S",
            "T",
            "U",
            "V",
            "W",
            "X",
            "Y",
            "Z",
        ]
        self.tableWidget = QTableWidget()
        self.tableWidget.setRowCount(self.maxRows)
        self.tableWidget.setColumnCount(len(self.headerLabels))
        self.tableWidget.setHorizontalHeaderLabels(self.headerLabels)
        for row in range(0, self.maxRows):
            for col in range(0, len(self.headerLabels)):
                self.tableWidget.setItem(
                    row,
                    col,
                    QTableWidgetItem(
                        "Cell {0}{1}".format(self.headerLabels[col], row + 1)
                    ),
                )
        self.tableWidget.resizeColumnsToContents()
        self.tableWidget.resizeRowsToContents()

        self.tableWidget.itemSelectionChanged.connect(self.on_selection_changed)

    @pyqtSlot()
    def on_selection_changed(self):
        self._selected_lists = []
        indexes = self.tableWidget.selectedIndexes()
        rows = [index.row() for index in indexes]
        columns = [index.column() for index in indexes]

        row_min, row_max = min(rows), max(rows)
        col_min, col_max = min(columns), max(columns)

        p = []
        for r in range(row_min, row_max + 1):
            q = []
            for c in range(col_min, col_max + 1):
                text = self.tableWidget.model().index(r, c).data()
                q.append(text if text is not None else "")
            p.append(q)
        self._selected_lists = p

        print(self.selected_lists)

    @property
    def selected_lists(self):
        return self._selected_lists


if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=198419&siteId=1