本站消息

站长简介/公众号


站长简介:逗比程序员,理工宅男,前每日优鲜python全栈开发工程师,利用周末时间开发出本站,欢迎关注我的微信公众号:程序员总部,程序员的家,探索程序员的人生之路!分享IT最新技术,关注行业最新动向,让你永不落伍。了解同行们的工资,生活工作中的酸甜苦辣,谋求程序员的最终出路!

  价值13000svip视频教程,python大神匠心打造,零基础python开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

PyQt5插入后选择一行

发布于2021-09-23 06:37     阅读(558)     评论(0)     点赞(2)     收藏(0)



将 PyQt5 与 QTableView、QSandardItemModel 和 QSortFilterProxy 一起使用。在模型上执行 insertRow 后,排序代理以正确的排序顺序显示视图表中的数据;但是,我需要在刚刚插入的记录上发出一个 view.selectRow。如果 ItemModel 以未排序的顺序存储数据,则不确定如何执行此操作。

类似但更短的例子:

from PyQt5 import QtCore, QtWidgets
from PyQt5.QtCore import Qt, QSortFilterProxyModel
from PyQt5.QtGui import QStandardItemModel, QStandardItem
from PyQt5.QtWidgets import QWidget, QInputDialog


class Ui_Dialog(QWidget):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(282, 247)
        self.tableView = QtWidgets.QTableView(Dialog)
        self.tableView.setGeometry(QtCore.QRect(10, 10, 256, 192))
        self.tableView.setObjectName("tableView")
        self.tableModel = QStandardItemModel()
        self.tableModel.setColumnCount(1)
        self.tableModel.setHeaderData(0, Qt.Horizontal, "Category Name")
        self.tableProxy = QSortFilterProxyModel()
        self.tableProxy.setSourceModel(self.tableModel)
        self.tableView.setModel(self.tableProxy)
        self.tableProxy.setSortCaseSensitivity(Qt.CaseInsensitive)
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(90, 210, 87, 29))
        self.pushButton.setObjectName("pushButton")
        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)
        self.setup_connections()
        self.load_data()
        self.tableProxy.sort(0)
        self.tableView.selectRow(0)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.pushButton.setText(_translate("Dialog", "New"))

    def setup_connections(self):
        self.pushButton.clicked.connect(self.add_record)

    def load_data(self):
        data = ('Alpha', 'Charlie', 'Foxtrot', 'Zulu', 'Bravo', 'Tango')
        for ndx, val in enumerate(data):
            print(ndx, val)
            item = QStandardItem(val)
            self.tableModel.insertRow(ndx, item)

    def add_record(self):
        i, ok = QInputDialog.getText(self, "Value Editor", "Emter A Value:")
        if ok:
            item = QStandardItem(i)
            self.tableModel.insertRow(self.tableModel.rowCount(), item)
            ### NEED TO TRIGGER TABLE TO SELECT THE ROW JUST INSERTED ###


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

解决方案


要选择一个必须使用selectionModel()视图的项,必须传递传递给视图的模型的索引,即代理,以及选择类型的标志。要获取代理的索引,您必须首先获取 sourceModel 的索引,为此您使用indexFromItem()转换QStandardItemQModelIndex,然后使用mapFromSource()从源转换为代理:

from PyQt5 import QtCore, QtGui, QtWidgets


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        self.tableView = QtWidgets.QTableView()
        self.tableModel = QtGui.QStandardItemModel()
        self.tableModel.setColumnCount(1)
        self.tableModel.setHeaderData(0, QtCore.Qt.Horizontal, "Category Name")
        self.tableProxy = QtCore.QSortFilterProxyModel()
        self.tableProxy.setSourceModel(self.tableModel)
        self.tableView.setModel(self.tableProxy)
        self.tableProxy.setSortCaseSensitivity(QtCore.Qt.CaseInsensitive)
        self.pushButton = QtWidgets.QPushButton("New")
        self.setup_connections()
        self.load_data()
        self.tableProxy.sort(0)
        self.tableView.selectRow(0)

        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(self.tableView)
        lay.addWidget(self.pushButton)

    def setup_connections(self):
        self.pushButton.clicked.connect(self.add_record)

    def load_data(self):
        data = ('Alpha', 'Charlie', 'Foxtrot', 'Zulu', 'Bravo', 'Tango')
        for ndx, val in enumerate(data):
            item = QtGui.QStandardItem(val)
            self.tableModel.insertRow(ndx, item)

    @QtCore.pyqtSlot()
    def add_record(self):
        i, ok = QtWidgets.QInputDialog.getText(self, "Value Editor", "Emter A Value:")
        if ok:
            item = QtGui.QStandardItem(i)
            self.tableModel.insertRow(self.tableModel.rowCount(), item)
            ix = self.tableModel.indexFromItem(item)
            ix_proxy = self.tableProxy.mapFromSource(ix)
            self.tableView.selectionModel().select(ix_proxy, QtCore.QItemSelectionModel.ClearAndSelect)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())






所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/1046146/70f786497544db9b8ef9/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

2 0
收藏该文
已收藏

评论内容:(最多支持255个字符)