0

伙计们。我正在开发一个用于控制一些机器人的 GUI。有一个表格显示该机器人的当前状态数据。并且该表格会根据测试服务器中的数据定期更新。当更新未连接时,很容易在表格中选择一行并保存所选行的数据.但是,当服务器连接时,无法选择一行(当您单击该行时,选定的行只会在闪烁中突出显示并消失)。我尝试使用一些打印方法来查看发生了什么里面,好像更新运行的时候slots不会实现。而且更新也会频繁的取消选择行。我正在考虑手动选择行的时候阻塞更新,然后自动选择同一个行逻辑和 selectRow() 方法。

1.updating 方法,作为 Gui Controller 类中的一个槽来管理输入

def tbRobotChanged(self, currentCell):

    # get the selected cell's index from currentCell,Implement the Slot method
    tablemodel= currentCell.model() 
    #get the model of the currentcell
    firstColumn = tablemodel.index(currentCell.row(),0)
    #change it to the first column in the row with the robot name

    self.statusBar().showMessage("Selected Robot is " +
                                 firstColumn.data().toString())
    self.selected_robot = int(firstColumn.data().toString())
    # show the selected robot name in the statusbar

2.table 定义,这是定义主窗口的 Gui 类的一部分:

def initRobotsFrame(self, rf):
    hbox = QtGui.QHBoxLayout()
    self.robot_table = QtGui.QTableView()
    self.table_header = ['Robot', 'PosX', 'PosY', 'Heading']
    tm = RobotTableModel([[0, 0, 0, 2],[1, 1,2,4]],
                         self.table_header)
    self.robot_table.setModel(tm)
    vh = self.robot_table.verticalHeader()
    vh.setVisible(False)
    self.robot_table.resizeColumnsToContents()
    self.robot_table.setSizePolicy(QtGui.QSizePolicy(
        QtGui.QSizePolicy.Minimum,
        QtGui.QSizePolicy.Minimum))
    hbox.addWidget(self.robot_table)
    self.selected_robot = 0

    block_true=GUIController.robot_data.blockSignals(True)
    GUIController.robot_data.blockSignals(block_true)
    # select table by row instead of by cell:
    self.robot_table.setSelectionBehavior(
        QtGui.QAbstractItemView.SelectRows)        
    # set the signal and slot using selectionModel:
    self.robot_table.selectionModel().currentRowChanged.connect(
        self.tbRobotChanged) 
    self.robot_table.selectionModel().currentRowChanged.connect(
        self.updateActiveRobot)
    # implement a statusbar to test the table selection functionality:
    self.statusBar().showMessage("Ready")         
    rf.setLayout(hbox)

3.slot获取选中行的数据:

def tbRobotChanged(self, currentCell):

    # get the selected cell's index from currentCell,Implement the Slot method
    tablemodel= currentCell.model() 
    #get the model of the currentcell
    firstColumn = tablemodel.index(currentCell.row(),0)
    #change it to the first column in the row with the robot name

    self.statusBar().showMessage("Selected Robot is " +
                                 firstColumn.data().toString())
    self.selected_robot = int(firstColumn.data().toString())
    # show the selected robot name in the statusbar 
4

0 回答 0