我在表单上有一个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_())
答案 0 :(得分:0)
由于您在类定义之外定义了onclick
,因此没有self
(也就是该类的实例)。将其定义为常规函数:
@QtCore.pyqtSlot(QtCore.QModelIndex)
def onclick(index):
editbox.setText(str(index.row()))
并将其作为listview.clicked.connect(onclick)
连接到信号。