QT tableView 添加代理 delegate问题

王桑的一天 2015-07-28 05:27:30
我用的是PyQt
下面代码,勾选列二的Checkbox就添加 Yes到单元格,没勾添加No。 可以正常工作

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys


class Delegate(QItemDelegate):

def __init__(self, owner):

super(Delegate, self).__init__(owner)

# self.items = items

def createEditor(self, parent, option, index):
editor = QCheckBox(parent)
return editor

def setEditorData(self, editor, index):
v = index.data()

def setModelData(self, editor, model, index):
if editor.isChecked():
v = 'Yes'
else:
v = 'No'

model.setData(index, v)

class Main(QMainWindow):

def __init__(self, parent=None):
super(Main, self).__init__(parent)
self.model = QStandardItemModel()
self.table = QTableView()
self.table.setEditTriggers(QAbstractItemView.CurrentChanged | QAbstractItemView.SelectedClicked )
self.table.setFocusPolicy(Qt.NoFocus)
self.table.setSelectionBehavior(QAbstractItemView.SelectRows)
self.table.setSelectionMode(QAbstractItemView.ExtendedSelection)

self.table.setModel(self.model)
self.model.setItem(0,0,QStandardItem('AAAA'))
self.model.setItem(0,1,QStandardItem( ''))
self.model.setItem(1,0,QStandardItem('BBBB'))
self.model.setItem(1,1,QStandardItem(''))

self.table.setItemDelegateForColumn(1, Delegate(self))

self.setCentralWidget(self.table)
self.setWindowTitle('Delegate Test')

self.show()

if __name__ == '__main__':
app = QApplication(sys.argv)
main = Main()
app.exec_()


但如果想向第二列添加图标,勾选就添加Checkbox的图标到列二,能成功,但Checkbox不会消失,且只能设置一次,再设置就不会写到单元格里。


from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys


class Delegate(QItemDelegate):

def __init__(self, owner):

super(Delegate, self).__init__(owner)

# self.items = items

def createEditor(self, parent, option, index):
editor = QCheckBox(parent)
return editor

def setEditorData(self, editor, index):
model = index.model()
value = model.item(index.row(), 1).icon()

def setModelData(self, editor, model, index):
model = index.model()
if editor.isChecked():
value = QIcon("./favorite.png")
else:
value = QIcon("./unfavorite.png")
model.setItem(index.row(), 1, QStandardItem(value, ''))

def updateEditorGeometry(self, editor, option, index):
newRect = option.rect
newRect.setX(newRect.x() + 33)
newRect.setY(newRect.y() + 9)
editor.setGeometry(newRect)

class Main(QMainWindow):

def __init__(self, parent=None):
super(Main, self).__init__(parent)
self.model = QStandardItemModel()
self.table = QTableView()
self.table.setEditTriggers(QAbstractItemView.CurrentChanged | QAbstractItemView.SelectedClicked )
self.table.setFocusPolicy(Qt.NoFocus)
self.table.setSelectionBehavior(QAbstractItemView.SelectRows)
self.table.setSelectionMode(QAbstractItemView.ExtendedSelection)

self.table.setModel(self.model)
self.model.setItem(0,0,QStandardItem('AAAA'))
self.model.setItem(0,1,QStandardItem( ''))
self.model.setItem(1,0,QStandardItem('BBBB'))
self.model.setItem(1,1,QStandardItem(''))

self.table.setItemDelegateForColumn(1, Delegate(self))

self.setCentralWidget(self.table)
self.setWindowTitle('Delegate Test')

self.show()

if __name__ == '__main__':
app = QApplication(sys.argv)
main = Main()
app.exec_()



这是什么情况,求教。
...全文
539 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr。Lili 2016-09-23
  • 打赏
  • 举报
回复
王桑的一天 2015-07-31
  • 打赏
  • 举报
回复
解决了,但没达到我想要的效果~

def setModelData(self, editor, model, index):
		value = index.data().toString()
		icon = editor.icon()
		if editor.isChecked():
			value = 'true'
			icon = QIcon(":/favorite.png")
		else:
			value = 'false'
			icon = QIcon(":/unfavorite.png")

		model.setData(index, value, Qt.DisplayRole)
		model.setData(index, icon, Qt.DecorationRole)
王桑的一天 2015-07-29
  • 打赏
  • 举报
回复
引用 1 楼 xyqdz 的回复:
只用c++ 写Qt,你这种语言好用吗?对于你的问题无能为力
C++的也行,很多都是参考C++的例子,网上PyQt的很少
Mr。Lili 2015-07-29
  • 打赏
  • 举报
回复
只用c++ 写Qt,你这种语言好用吗?对于你的问题无能为力

16,215

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧