2016-08-23 257 views
0

我有一个表格上而QListView和一个QTextEdit,我想,让他们一起工作,如下连接:如果一个复选框被选中,对应项的而QListView的指数应显示在QTextEdit中;如果复选框未选中,则应该从QTextEdit中删除该值。索引应该累积显示,用一个字符(比如逗号)分隔,例如0,1,3。相反,如果在QTextEdit中键入一个值,则应该自动检查相应的复选框(如果输入的值不对应于QListView中的任何索引,则应该自动检查该复选框(如果没有,则不设置)。PyQt的:而QListView与QTexEdit

我试图通过一个处理程序连接到而QListView的点击事件,如下赶选择checboxes的指标:

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

但得到错误信息:“NameError:全局名称'自我'没有定义“。

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

这里是我完整的测试代码:

编辑:我改变了下面的代码与事件处理程序妥善处理。

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

回答

0

既然你定义onclick外的类定义的,没有self(它指的是类的实例),无论是。它定义为一个普通函数:

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

,并将其连接到信号listview.clicked.connect(onclick)