注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

银河军团大本营

光荣的军团,永远的丰碑 <坚持原创>

 
 
 

日志

 
 

PyQt QTableView嵌入QComboBox  

2012-10-15 20:41:38|  分类: PyQt |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

  关联文章:PyQt QTableView嵌入QCheckBox

  在Qt里,在QTableView中嵌入QComboBox真的很方便,只要实现一个QItemDelegate就可以了;QComboBox要想实现自定义下拉框也很方便,只要调用setView即可。PyQt示例代码如下:

#!/usr/bin/env python
#coding=utf-8

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

class DBComboBoxDelegate(QItemDelegate):

def __init__(self, comboModel, parent=None):
QItemDelegate.__init__(self, parent)
self.comboModel = comboModel

def __createComboView(self, parent):
view = QTableView(parent)
view.setModel(self.comboModel)
view.setAutoScroll(False)
view.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
view.setSelectionMode(QAbstractItemView.SingleSelection)
view.setSelectionBehavior(QAbstractItemView.SelectRows)
view.resizeColumnsToContents()
view.resizeRowsToContents()
view.setMinimumWidth(view.horizontalHeader().length())
return view

def createEditor(self, parent, option, index):
combo = QComboBox(parent)
#!! The important part: First set the model, then the view on the combo box
combo.setModel(self.comboModel)
#combo.setModelColumn(1)
combo.setView(self.__createComboView(parent))
return combo

def setEditorData(self, editor, index):
value = index.model().data(index, Qt.EditRole).toString()
editor.setCurrentIndex(editor.findText(value))

def setModelData(self, editor, model, index):
if editor.currentIndex() >= 0:
realidx = editor.model().index(editor.currentIndex(), 0) #确保取第一列的值
value = editor.model().data(realidx)
model.setData(index, value, Qt.EditRole)

###############################################################################

if __name__ == '__main__':
import sys
app = QApplication(sys.argv)

table = QTableView()

comboModel = QStandardItemModel(4, 2, table)
comboModel.setHorizontalHeaderLabels(['Name', 'Description'])
comboModel.setData(comboModel.index(0, 0, QModelIndex()), QVariant(u'树袋熊'))
comboModel.setData(comboModel.index(0, 1, QModelIndex()), QVariant(u'生活在树上的熊'))
comboModel.setData(comboModel.index(1, 0, QModelIndex()), QVariant(u'松鼠'))
comboModel.setData(comboModel.index(1, 1, QModelIndex()), QVariant(u'可爱的松树精灵'))
comboModel.setData(comboModel.index(2, 0, QModelIndex()), QVariant(u'大眼猴'))
comboModel.setData(comboModel.index(2, 1, QModelIndex()), QVariant(u'这猴眼睛真大'))
comboModel.setData(comboModel.index(3, 0, QModelIndex()), QVariant(u'猫头鹰'))
comboModel.setData(comboModel.index(3, 1, QModelIndex()), QVariant(u'夜的精灵正站在树枝上'))

model = QStandardItemModel(2, 3, table)
model.setHorizontalHeaderLabels(['Name', 'Height', 'Weight'])
model.setData(model.index(0, 0, QModelIndex()), QVariant(u'松鼠'))
model.setData(model.index(0, 1, QModelIndex()), QVariant(u'80cm'))
model.setData(model.index(0, 2, QModelIndex()), QVariant(u'12Kg'))

table.setModel(model)
table.setItemDelegateForColumn(0, DBComboBoxDelegate(comboModel, table))
table.horizontalHeader().setStretchLastSection(True)
table.setGeometry(80, 20, 400, 300)
table.setWindowTitle('Grid + Combo Testing')
table.show()

sys.exit(app.exec_())


  下面是在ubuntu下的效果图:

PyQt QTableView嵌入QComboBox - 银河军团 - 银河军团大本营
 
PyQt QTableView嵌入QComboBox - 银河军团 - 银河军团大本营
  评论这张
 
阅读(7319)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018