【问题标题】:How to connect QItemDelegate (QLineEdit) change to QSortFilterProxyModel PyQt4?如何将 QItemDelegate (QLineEdit) 更改连接到 QSortFilterProxyModel PyQt4?
【发布时间】:2016-02-29 08:19:08
【问题描述】:

我尝试通过在我的 QtableView 的第一行中继承 QItemDelegate 来设置 QlineEdit:

class ExampleDelegate(QItemDelegate):
    def createEditor(self, parent, option, index):
        self.line_edit = QLineEdit(parent)
        return self.line_edit

class example(QDialog):
    def __init__(self):
        super(druglist, self).__init__()
        self.UI()
    def UI(self):
        self.table_view=QTableView()
        self.delegate = ExampleDelegate()   
        self.table_view.setItemDelegateForColumn(0, self.delegate)
        self.table_model=QStandardItemModel()

        self.table_proxy=QSortFilterProxyModel()
        self.table_proxy.setSourceModel(self.table_model)

        self.table_view.setModel(self.table_proxy)

        self.delegate.textChanged.connect(self.lineedit_textchange) //do something like this

     def lineedit_textchange(self,text):
        search=QRegExp(text,Qt.CaseInsensitive,QRegExp.RegExp)
        self.table_proxy_model.setFilterRegExp(search)

我只想知道如何将我的ExampleDelegate 文本更改连接到我的主类中的lineedit_textchange 函数?

【问题讨论】:

    标签: python pyqt pyqt4 qtableview qitemdelegate


    【解决方案1】:

    您不应连接到委托中的line_edit。代表在这里是在您的QTableView 的多个单元格中设置自定义编辑器(这里是第 0 列中的所有单元格)。 如果你可以连接到代理中的line_edit,你怎么知道哪个单元格被改变了?

    您想要知道第 0 列中的单元格何时更改。每个模型都有dataChanged 信号:

    void QAbstractItemModel::dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight)

    只要现有项目中的数据发生变化,就会发出此信号。

    您可以连接到此信号以获取刚刚更改的单元格的索引。您可以检查此单元格是否在第 0 列中,然后进行相应操作:

    def UI(self):
        self.model=QStandardItemModel(4,2)
        self.model.dataChanged.connect(self.on_dataChanged)
    
        self.delegate=Delegate()
    
        self.view=QTableView()
        self.view.setItemDelegateForColumn(0,self.delegate)
        self.view.setModel(self.model)
    
    def on_dataChanged(self,index,index2):
        print(index,index2)
        print(index.data())
        print(index.column())
        if index==index2 and index.column()==0:
            #do stuff
    

    【讨论】:

    • 让我们明确一点,在这张图片中:oi67.tinypic.com/dxxwkk.jpg 我想将我的搜索行编辑移动到表格内(列顶部的一个额外的单元格或字段)。你能告诉我究竟是什么我需要?我在网上找不到任何东西
    • 我相信你已经掌握了做你想做的事所需的所有信息,这个答案和你之前的问题。也许您对如何为行而不是列设置委托感到困惑?
    • 令人困惑的部分是将委托更改(lineedit 文本更改)赋予 self.table_proxy_model.setFilterRegExp(search) 作为搜索
    • 当行编辑文本改变时,dataChanged 将被发射,带有单元格的索引。行编辑的文本是单元格的数据(index.data()
    • 好的,但是 index.data() 返回所有项目,我需要将第一个单元格 (0,0) 项目提供给我的 lineedit_textchange() 。感谢您花时间在我的问题上
    猜你喜欢
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    相关资源
    最近更新 更多