Сканирование штрих-кода с PyQt5 - PullRequest
1 голос
/ 04 августа 2020

У меня есть USB-сканер штрих-кода, который я подключаю к своему компьютеру. Каждый раз, когда он сканирует штрих-код, он вводит данные в компьютер, как клавиатура. Моей целью было ввести данные в виджет PyQT5 Table.

Я создал таблицу ниже и просто просматриваю элементы в ней. Проблема в том, что когда я сканирую элемент, он редактирует первую ячейку, но курсор не перемещается автоматически к следующей строке, поэтому я могу сканировать новый элемент в таблице. Мне нужно щелкнуть по второй ячейке, а затем отсканировать элемент. Затем щелкните третью ячейку и отсканируйте элемент и т. Д.

Мне было интересно, как я могу автоматизировать его, чтобы после сканирования элемента в первую ячейку он автоматически переместился в следующую ячейку и ждал ввод со сканера?

import sys 
from PyQt5.QtWidgets import * 
   
#Main Window 
class App(QWidget): 
    def __init__(self): 
        super().__init__() 
        self.title = 'Specimen Dashboard'

        self.setWindowTitle(self.title)    
        self.tableWidget = QTableWidget() 
        self.createTable() 
        self.tableWidget.itemChanged.connect(self.go_to_next_row) 
   
        self.layout = QVBoxLayout() 
        self.layout.addWidget(self.tableWidget) 
        self.setLayout(self.layout) 

        self.show() 
   
    def go_to_next_row(self):
        #Not working
        #Trying to see if I can automatically move to next cell, but editing it 
        self.tableWidget.setItem(1,0, QTableWidgetItem("Name")) 

    #Create table 
    def createTable(self):   
        self.tableWidget.setRowCount(4)  
        self.tableWidget.setColumnCount(2)   
        self.tableWidget.horizontalHeader().setStretchLastSection(True) 
        self.tableWidget.horizontalHeader().setSectionResizeMode( 
            QHeaderView.Stretch) 

app = QApplication(sys.argv) 
ex = App() 
sys.exit(app.exec_()) 

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

По умолчанию сканеры отправляют конечную строку ("\ n"), которая переводится как клавиша Return или Enter, и по умолчанию закрывает редактор, в этом случае это событие необходимо перехватить, переместите курсор и откройте редактор:

import sys

from PyQt5 import QtCore, QtWidgets


class TableWidget(QtWidgets.QTableWidget):
    def keyPressEvent(self, event):
        if (
            event.key() in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return)
            and self.state() == QtWidgets.QAbstractItemView.EditingState
        ):
            index = self.moveCursor(
                QtWidgets.QAbstractItemView.MoveNext, QtCore.Qt.NoModifier
            )
            self.selectionModel().setCurrentIndex(
                index, QtCore.QItemSelectionModel.ClearAndSelect
            )
            self.edit(index)
        else:
            super().keyPressEvent(event)


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.tableWidget = TableWidget(4, 2)
        self.setCentralWidget(self.tableWidget)
        self.tableWidget.horizontalHeader().setStretchLastSection(True)
        self.tableWidget.horizontalHeader().setSectionResizeMode(
            QtWidgets.QHeaderView.Stretch
        )


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
1 голос
/ 05 августа 2020

Вы можете создать подкласс таблицы и перезаписать closeEditor(): аргумент hint сообщает представлению, что должно произойти, когда редактор был закрыт; по умолчанию при нажатии Enter передаются данные текущей ячейки, но вы можете изменить это поведение следующим образом:

from PyQt5 import QtGui, QtWidgets

class Table(QtWidgets.QTableView):
    # leave to False for the default behavior (the next cell is the one at the
    # right of the current, or the first of the next row; when set to True it
    # will always go to the next row, while keeping the same column
    useNextRow = False

    def closeEditor(self, editor, hint):
        if hint == QtWidgets.QAbstractItemDelegate.SubmitModelCache:
            if self.useNextRow:
                super().closeEditor(editor, hint)
                current = self.currentIndex()
                newIndex = current.sibling(current.row() + 1, current.column())
                if newIndex.isValid():
                    self.setCurrentIndex(newIndex)
                    self.edit(newIndex)
                return
            else:
                hint = QtWidgets.QAbstractItemDelegate.EditNextItem
        super().closeEditor(editor, hint)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    test = Table()
    test.show()
    model = QtGui.QStandardItemModel(10, 5)
    test.setModel(model)
    sys.exit(app.exec_())
...