PyQt QTableView嵌入QComboBox

  原文链接:PyQt QTableView嵌入QComboBox

  关联文章: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下的效果图:

QTableView+QComboBox效果图

QTableView+QComboBox效果图2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值