为了账号安全,请及时绑定邮箱和手机立即绑定

使用 PyQt5 扫描条形码

使用 PyQt5 扫描条形码

POPMUISE 2023-04-25 16:04:12
我有一个 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 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

默认情况下,扫描仪发送一个结束行(“\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_())


查看完整回答
反对 回复 2023-04-25
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

您可以将表子类化并覆盖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_())


查看完整回答
反对 回复 2023-04-25
  • 2 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信