我试图在表格中显示一个组合框,以便可以设置表格模型中的选定索引,就像表格中的其他单元格一样。我从其他示例中将其拼凑而成,但仍然无法理解交互如何设置QComboBox的选定索引。
这是我可以用来说明问题的最简单的示例。是否有人可以演示如何根据模型数据自动设置索引?还有如何使用’currentIndexChanged’信号,因为每当重新粉刷时它似乎几乎连续触发?谢谢。
# The following tells SIP (the system that binds Qt's C++ to Python)
# to return Python native types rather than QString and QVariant
import sip
sip.setapi('QString', 2)
sip.setapi('QVariant', 2)
from PyQt4 import QtCore, QtGui
class TableModel(QtCore.QAbstractTableModel):
"""
A simple 5x4 table model to demonstrate the delegates
"""
def rowCount(self, parent=QtCore.QModelIndex()): return 5
def columnCount(self, parent=QtCore.QModelIndex()): return 4
def data(self, index, role=QtCore.Qt.DisplayRole):
if not index.isValid(): return None
if not role==QtCore.Qt.DisplayRole: return None
return "{0:02d}".format(index.row())
class ComboDelegate(QtGui.QItemDelegate):
"""
A delegate that places a fully functioning QComboBox in every
cell of the column to which it's applied
"""
def __init__(self, parent):
QtGui.QItemDelegate.__init__(self, parent)
def paint(self, painter, option, index):
self.combo = QtGui.QComboBox(self.parent())
self.connect(self.combo, QtCore.SIGNAL("currentIndexChanged(int)"), self.parent().currentIndexChanged)
li = []
li.append("Zero")
li.append("One")
li.append("Two")
li.append("Three")
li.append("Four")
li.append("Five")
self.combo.addItems(li)
if not self.parent().indexWidget(index):
self.parent().setIndexWidget(
index,
self.combo
)
class TableView(QtGui.QTableView):
"""
A simple table to demonstrate the QComboBox delegate.
"""
def __init__(self, *args, **kwargs):
QtGui.QTableView.__init__(self, *args, **kwargs)
# Set the delegate for column 0 of our table
# self.setItemDelegateForColumn(0, ButtonDelegate(self))
self.setItemDelegateForColumn(0, ComboDelegate(self))
@QtCore.pyqtSlot()
def currentIndexChanged(self, ind):
print "Combo Index changed {0} {1} : {2}".format(ind, self.sender().currentIndex(), self.sender().currentText())
if __name__=="__main__":
from sys import argv, exit
class Widget(QtGui.QWidget):
"""
A simple test widget to contain and own the model and table.
"""
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
l=QtGui.QVBoxLayout(self)
self._tm=TableModel(self)
self._tv=TableView(self)
self._tv.setModel(self._tm)
l.addWidget(self._tv)
a=QtGui.QApplication(argv)
w=Widget()
w.show()
w.raise_()
exit(a.exec_())
您使用的paint
方法不正确。当您要更改视图的显示行为时,应使用它。每次要绘制时也创建新的小部件非常昂贵。但是您想更改编辑行为,因此需要更改程序的整个逻辑。
请参阅固定代码。下面我将解释这些更改。
1.
首先,我们需要使第一列可编辑。您可以通过重新实现QAbstractItemModel::flags
:
def flags(self, index):
if (index.column() == 0):
return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled
else:
return QtCore.Qt.ItemIsEnabled
2.
默认情况下,当用户执行双击项目时,将创建项目编辑器。如果要默认显示所有组合框,则可以使用openPersistentEditor
:
for row in range(0, self._tm.rowCount()):
self._tv.openPersistentEditor(self._tm.index(row, 0))
请注意,您还应该打开新创建的单元格的编辑器(如果有)。
3.
现在回到我们的代表。我们需要实现createEditor
一种方法,该方法将在为单元格请求编辑器时由视图自动调用:
def createEditor(self, parent, option, index):
combo = QtGui.QComboBox(parent)
li = []
li.append("Zero")
li.append("One")
li.append("Two")
li.append("Three")
li.append("Four")
li.append("Five")
combo.addItems(li)
self.connect(combo, QtCore.SIGNAL("currentIndexChanged(int)"),
self, QtCore.SLOT("currentIndexChanged()"))
return combo
请注意,该connect
值低于append
s,因为我们需要避免currentIndexChanged
在初始化时发出信号。
4.``setEditorData
更改模型数据后,视图将调用的Implement方法。初始化编辑器时,也会调用一次。
def setEditorData(self, editor, index):
editor.blockSignals(True)
editor.setCurrentIndex(int(index.model().data(index)))
editor.blockSignals(False)
再次,我们要避免不是由用户引起的信号,因此我们使用blockSignals
。
5.
在插槽中,我们只是发出commitData
信号,这将导致视图调用setModelData
我们的委托的:
@QtCore.pyqtSlot()
def currentIndexChanged(self):
self.commitData.emit(self.sender())
6.
实现setModelData
方法:
def setModelData(self, editor, model, index):
model.setData(index, editor.currentIndex())
7.
您的模型需要支持数据更改。因此,我们应该实现setData
模型的方法:
def setData(self, index, value, role=QtCore.Qt.DisplayRole):
print "setData", index.row(), index.column(), value
# todo: remember the data
我正在 中使用 现在我遇到了表视图单元格高度的问题。我正在聊天屏幕上工作,所以我有文字,图像。所以我在管理屏幕的其中取了一个原型单元。现在下面是我的身高代码 因此,文本单元格没有得到我所期望的,但我不知道我的错误在哪里,还有一件事,如果我< code > returnuitableviewautomaticdimension ,它的工作很好的文本信息,而不是图像。请帮助我,先谢了。
我创建了一个几乎为空的UIViewController类,名为。在视图中,我设置标题并添加一个关闭按钮到导航我tem.leftBarButtonItem。 我的如下所示: 显示viewController时,其视图的背景为黑色。如何设置它的视图以用空视图填充屏幕——就像在故事板中设置UIViewController一样? 我已经尝试将以下内容添加到视图,但是视图仍然是黑色的:
我正在使用Vaadin,我想为网格/表格中的特定单元格设置背景颜色,或者如果无法为特定单元格设置背景颜色,我想至少为网格/表格中的特定单元格设置字体颜色。我有网格/表格的代码TableView如下: 网格/表的内容类为: 如果可以为特定单元格设置背景颜色,或者至少设置字体颜色,并且你知道怎么做,请写信。例如,网格/表格中单元格的值为“1”,我想将其设为红色,但如果单元格的值为“5”,我想将其设为绿
提前谢谢。
问题内容: 我有一个带有各种 屏幕 的应用程序。每个屏幕都分配一个URL,如,,,等。 在我的主要HTML文件中,我有一个根据用户选择的路线进行更新的元素。到目前为止,一切都很好。 现在,其中一些屏幕具有子导航。例如,确实有一个收件箱和一个已发送的文件夹。他们用两列显示自己:左侧的子导航,右侧的相应文件夹的邮件。 当您导航到时,它将重定向到,因此 收件箱 基本上是 邮件 的默认子视图。 我该如何设
我有一个具有各种屏幕的应用程序。每个屏幕都分配了一个URL,例如,,,等等。 在我的主HTML文件中,我有一个元素,它根据用户选择的路线进行更新。到目前为止,一切顺利。 现在这些屏幕中的一些有子导航。例如,确实有一个收件箱和一个已发送的文件夹。它们有两列:左边是子导航,右边是相应文件夹的邮件。 当您导航到时,它会将您重定向到,因此基本上收件箱是邮件的默认子视图。 我该怎么设置呢? 我目前能想到的唯