使用 PyQt5 扫描条形码

我有一个 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_()) 


POPMUISE
浏览 185回答 2
2回答

jeck猫

默认情况下,扫描仪发送一个结束行(“\n”),它被翻译成 Return 或 Enter 键,这默认关闭编辑器,在这种情况下必须拦截该事件,移动光标并打开编辑器:import sysfrom PyQt5 import QtCore, QtWidgetsclass 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_())

哈士奇WWW

您可以将表子类化并覆盖closeEditor():hint参数告诉视图当编辑器关闭时应该发生什么;默认情况下,当按下Enter当前单元格数据时提交,但您可以像这样覆盖此行为:from PyQt5 import QtGui, QtWidgetsclass 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_())
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python