PyQt:与QTextEdit相关的QListView

问题描述 投票:0回答:1

我在表单上有一个QListView和一个QTextEdit,我想让它们一起工作,如下所示:如果选中了一个复选框,QlistView中相应项目的索引应该显示在QTextEdit中;如果未选中该复选框,则应从QTextEdit中删除该值。索引应累积显示,由一个字符(例如逗号)分隔,例如,0,1,3。

相反,如果在QTextEdit中键入值,则应自动检查相应的复选框(如果输入的值与QListView中的任何索引不对应,则不会选中)。

我试图通过将处理程序附加到ListView的单击事件来捕获所选复选框的索引,如下所示:

<del>@QtCore.pyqtSlot(QtCore.QModelIndex)
    def onclick(self, index):
        editbox.setText(str(index.row()))</del>

但收到错误消息:“NameError:全局名称'self'未定义”。

任何提示?在此先感谢您提供的任何帮助!

这是我完整的测试代码:

编辑:我更改了下面的代码,以正确处理事件处理程序。

import sys
from PyQt4 import Qt, QtCore, QtGui

class MainWindow(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)

        model = QtGui.QStandardItemModel()
        for n in range(10):                   
            item = QtGui.QStandardItem('Item %s' % n)
            item.setCheckState(QtCore.Qt.Unchecked)
            item.setCheckable(True)
            model.appendRow(item)

        listview = QtGui.QListView()
        listview.setModel(model)
        listview.clicked.connect(self.onclick)

        self.editbox = QtGui.QTextEdit()
        self.editbox.textChanged.connect(self.onchange)

        grid = QtGui.QGridLayout()
        grid.setRowStretch(0, 6)
        grid.setRowStretch(1, 4)
        grid.addWidget(listview)
        grid.setSpacing(2)
        grid.addWidget(self.editbox)

        self.setLayout(grid)
        self.setGeometry(300, 150, 350, 300)
        self.setWindowTitle("Example")
        self.show()

    #@QtCore.pyqtSlot(QtCore.QModelIndex)
    def onclick(self, index):
        self.editbox.append(str(index.row()))

    def onchange(self):
        print "text in edit box changed"

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    mw = MainWindow()
    sys.exit(app.exec_())
python pyqt4
1个回答
0
投票

因为你在类定义之外定义onclick,所以也没有self(它指的是类的一个实例)。将其定义为常规函数:

@QtCore.pyqtSlot(QtCore.QModelIndex)
def onclick(index):
    editbox.setText(str(index.row()))

并将其作为listview.clicked.connect(onclick)连接到信号。

© www.soinside.com 2019 - 2024. All rights reserved.