PyQt 5 QTableView 选择栏问题

Posted

技术标签:

【中文标题】PyQt 5 QTableView 选择栏问题【英文标题】:PyQt 5 QTableView selection bar issue 【发布时间】:2014-12-29 10:42:54 【问题描述】:

我有一个 QTableView,上面有一个按钮来更新选定的行 更新按钮调用一个Form来更新记录(其他类的Qdialog)

更新记录后,我将焦点移回 Qtableview,但我找不到它 将焦点放在选择栏上?

表格回来了,但我总是需要在表格中单击才能恢复选择栏?

有人知道怎么做吗?

我还希望将选择栏放在刚刚更新的记录上

我已经用 setfocus/activatewindow 尝试过了……但是没有给我想要的结果:

下面是一些示例代码:

class KL_browse(QDialog, ui_kl_browse.Ui_kl_browse):       
    def __init__(self):
        super(KL_browse, self).__init__()
       # query = QSqlQuery()

       # query.exec_("""SELECT * FROM klanten ORDER BY klantnaam""")

        self.setupUi(self)

        self.model = QSqlTableModel(self)
        self.model.setTable("KLANTEN")
      #  self.model.setSort(1, Qt.AscendingOrder)
        self.model.select()
        self.tableView.setModel(self.model)
        self.tableView.setSelectionMode(QTableView.SingleSelection)
        self.tableView.setSelectionBehavior(QTableView.SelectRows)
     #   self.view.setColumnHidden(ID, True)
     #   index = self.tableView.model().index(0, 1)
     #   self.tableView.selectionModel().setCurrentIndex(index, QItemSelectionModel.NoUpdate)      

        self.tableView.horizontalHeader().setSectionsMovable(True)
        self.tableView.horizontalHeader().setDragEnabled(True)
        self.tableView.horizontalHeader().setDragDropMode(QAbstractItemView.InternalMove)
        self.tableView.horizontalHeader().setSortIndicator(1,0)
        self.tableView.selectRow(0)
        self.tableView.selectColumn(1) 

        index = self.tableView.model().index(0, 1)
        self.tableView.selectionModel().setCurrentIndex(index, QItemSelectionModel.NoUpdate)      

   # Volgende code is om de actie op knoppen en dergelijke op te vangen
        self.add_button.clicked.connect(self.test_win_start)
        self.Del_button.clicked.connect(self.del_record)

    def del_record(self):
         index = self.tableView.currentIndex()
         self.model.removeRow(index.row())
         self.model.submitAll()
         self.model.select()
         self.tableView.activateWindow()
         self.tableView.setFocus()

    def test_win_start(self):
         self.test_win = Test_win()
         self.test_win.exec_() 
         self.model.select() 
         self.tableView.activateWindow()

del_record 删除一条记录,但焦点没有回到选择栏! test_win_start 调用更新表单

【问题讨论】:

您解决了this 吗?显然,修复程序现在在此代码中,但是为什么不选择一个答案:) 更重要的是,您的格式被破坏了。选择您的代码并按 ctrl-k 自动格式化。 【参考方案1】:

我认为问题在于您只是粘贴了这两行 from my other answer:

index = self.tableView.model().index(0, 1)
self.tableView.selectionModel().setCurrentIndex(index, QItemSelectionModel.NoUpdate)

这旨在更改搜索字段,但并不意味着将选择返回给您。

为此,您需要一个非常相似但不同的机制,即:更改视图上的当前索引,而不仅仅是在后台数据模型上。下面是应该工作的代码:

index = self.tableView.model().index(0, 1)
self.tableView.setCurrentIndex(index)

【讨论】:

以上是关于PyQt 5 QTableView 选择栏问题的主要内容,如果未能解决你的问题,请参考以下文章

pyqt qt4 QTableView 如何禁用某些列的排序?

PyQt:Windows Vista/7 上 QTableView 中的 QStyledItemDelegate?

PyQt4 - QTableView - 如何循环 QTableView

PyQt5 QTableView 用 Delegate 选择单元格背景

PyQt QTableView 更新到 PyQt 4.5.1 后不显示图标

PyQt5 QTableView:如何在保持默认样式/颜色的同时禁用用户交互/选择?