PyQt:与QTextEdit相关的QListView

时间:2016-08-23 22:22:17

标签: python pyqt4

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

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

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

<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_())

1 个答案:

答案 0 :(得分:0)

由于您在类定义之外定义了onclick,因此没有self(也就是该类的实例)。将其定义为常规函数:

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

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