我试图在编辑 qtable 单元格后更改它的背景颜色。我已经看过问题“编辑 QTableView 单元格后如何更改背景颜色? ”,我遇到的问题是,在答案的示例中,我不明白“角色”来自哪里。我的意思是,角色在哪里声明以及角色在哪里改变其值?我只看到角色与“Qt.Core.xxx”相比的位置
import sys
from PyQt4 import QtGui, QtCore
class Model(QtCore.QAbstractTableModel):
def __init__(self, parent=None):
super(Model, self).__init__(parent)
# list of lists containing [data for cell, changed]
self._data = [[['%d - %d' % (i, j), False] for j in range(10)] for i in range(10)]
def rowCount(self, parent):
return len(self._data)
def columnCount(self, parent):
return len(self._data[0])
def flags(self, index):
return QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled |QtCore.Qt.ItemIsEditable
def data(self, index, role):
if index.isValid():
data, changed = self._data[index.row()][index.column()]
if role in [QtCore.Qt.DisplayRole, QtCore.Qt.EditRole]: …Run Code Online (Sandbox Code Playgroud) 在我的 gui 文件中,我创建了一个 QTableView,如下所示(这是 Qt Designer 自动生成的部分):
self.pnl_results = QtGui.QTableView(self.tab_3)
font = QtGui.QFont()
font.setPointSize(7)
self.pnl_results.setFont(font)
self.pnl_results.setFrameShape(QtGui.QFrame.StyledPanel)
self.pnl_results.setFrameShadow(QtGui.QFrame.Sunken)
self.pnl_results.setEditTriggers(QtGui.QAbstractItemView.AllEditTriggers)
self.pnl_results.setShowGrid(True)
self.pnl_results.setSortingEnabled(True)
self.pnl_results.setCornerButtonEnabled(True)
self.pnl_results.setObjectName("pnl_results")
Run Code Online (Sandbox Code Playgroud)
然后,我定义一个模型,使我能够将 pandas 数据框链接到 QTableView:
class PandasModel(QtCore.QAbstractTableModel):
"""
Class to populate a table view with a pandas dataframe
"""
def __init__(self, data, parent=None):
QtCore.QAbstractTableModel.__init__(self, parent)
self._data = data
def rowCount(self, parent=None):
return len(self._data.values)
def columnCount(self, parent=None):
return self._data.columns.size
def data(self, index, role=QtCore.Qt.DisplayRole):
if index.isValid():
if role == QtCore.Qt.DisplayRole:
return str(self._data.values[index.row()][index.column()])
return None
def headerData(self, col, orientation, role):
if orientation …Run Code Online (Sandbox Code Playgroud) 我有一个 pandas 数据框,我想将其呈现在 QtableView 中并使其可编辑。我创建了以下模型,但由于某种原因,输出在每个字段中都有复选框。我怎样才能摆脱它们?
这是用于制作 qtavleview 中显示的 pandas 数据框并使其可编辑的模型(我正在使用 PySide)
class PandasModelEditable(QtCore.QAbstractTableModel):
def __init__(self, data, parent=None):
QtCore.QAbstractTableModel.__init__(self, parent)
self._data = data
def rowCount(self, parent=None):
return len(self._data.values)
def columnCount(self, parent=None):
return self._data.columns.size
def data(self, index, role=QtCore.Qt.DisplayRole):
if index.isValid():
if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole:
return unicode(self._data.iloc[index.row(), index.column()])
return unicode()
def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole):
if role != QtCore.Qt.DisplayRole:
return None
if orientation == QtCore.Qt.Horizontal:
try:
return '%s' % unicode(self._data.columns.tolist()[section])
except (IndexError,):
return unicode()
elif orientation == QtCore.Qt.Vertical: …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个TableView具有排序功能的。如果我将TableViewobj 设置为我的自定义HeaderView,则单击标题将不会排序,即使我的自定义HeaderView没有重新实现任何内容。如果我使用 的TableViewheader ( hh=tv.horizontalHeader()) 来代替,它就会排序。我究竟做错了什么?
代码如下:
import sys
import operator
from PyQt5 import QtWidgets
from PyQt5.QtCore import QAbstractTableModel, Qt, QVariant
class TableModel(QAbstractTableModel):
def __init__(self, parent, datain, headerdata):
super(TableModel,self).__init__(parent)
self.arraydata=datain
self.headerdata=headerdata
def rowCount(self,p):
return len(self.arraydata)
def columnCount(self,p):
if len(self.arraydata)>0:
return len(self.arraydata[0])
return 0
def data(self, index, role):
if not index.isValid():
return QVariant()
elif role != Qt.DisplayRole:
return QVariant()
return QVariant(self.arraydata[index.row()][index.column()])
def headerData(self, col, orientation, role):
if orientation==Qt.Horizontal and role==Qt.DisplayRole: …Run Code Online (Sandbox Code Playgroud) 我基于 QAbstractTableModel 创建一个类“pandasModel”,如下所示:
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class pandasModel(QAbstractItemModel):
def __init__(self, data, parent=None):
QAbstractItemModel.__init__(self, parent)
self._data = data
def rowCount(self, parent=None):
return self._data.index.size
def columnCount(self, parent=None):
return self._data.columns.size
def data(self, index, role=Qt.DisplayRole):
if index.isValid():
if role == Qt.DisplayRole:
return str(self._data.iloc[index.row(), index.column()])
if role == Qt.EditRole:
return str(self._data.iloc[index.row(), index.column()])
return None
def headerData(self, rowcol, orientation, role):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return self._data.columns[rowcol]
if orientation == Qt.Vertical and …Run Code Online (Sandbox Code Playgroud) 我正在使用自定义委托在QTableView中显示一列comboBoxes。
除了默认选择问题(在此处输入链接描述)之外,我在对QTableView的数据重新排序时(按列或通过应用过滤器)还有一个问题。combox保持不显示网格时的位置。
有什么方法可以强制重绘代表?我复制了paint方法的代码(没有索引),但这只会导致程序崩溃。
让我知道我是否还不够清楚。
这是我的自定义委托的代码:
class ComboBoxDelegate(QtGui.QItemDelegate):
def __init__(self, parent, itemslist):
QtGui.QItemDelegate.__init__(self, parent)
self.itemslist = itemslist
self.parent = parent
def paint(self, painter, option, index):
# Get Item Data
value = index.data(QtCore.Qt.DisplayRole).toInt()[0]
# value = self.itemslist[index.data(QtCore.Qt.DisplayRole).toInt()[0]]
# fill style options with item data
style = QtGui.QApplication.style()
opt = QtGui.QStyleOptionComboBox()
opt.currentText = str(self.itemslist[value])
opt.rect = option.rect
# draw item data as ComboBox
style.drawComplexControl(QtGui.QStyle.CC_ComboBox, opt, painter)
self.parent.openPersistentEditor(index)
def createEditor(self, parent, option, index):
##get the "check" value of the row
# for …Run Code Online (Sandbox Code Playgroud) 这似乎应该很容易.基本上我正在实现反转选择功能.
我正在获取所选项目,然后选择所有项目,我想迭代所选项目列表并取消选择它们.如果这不是最好的方式,我愿意接受我的想法,但我想知道的是如何取消选择一个特定的行
QModelIndexList indexs = this->selectedIndexes();
this->selectAll();
foreach(QModelIndex index, indexs)
{
// Deselect row at index....
}
Run Code Online (Sandbox Code Playgroud) 使用QAbstractTableModel的flag()方法将QTableView设置为可编辑:
def flags(self, index):
return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsEditable
Run Code Online (Sandbox Code Playgroud)
双击QTableView的项目将此项目置于编辑模式.默认情况下,预先存在的字符串从字段中消失,整个项目为空白.我想知道这种行为是否可以避免或被覆盖?
在用户双击它之前,这是QTableView字段:

以下是双击时的外观:

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys, os
class Model(QAbstractTableModel):
def __init__(self, parent=None, *args):
QAbstractTableModel.__init__(self, parent, *args)
self.items =[
['Row0_Column0','Row0_Column1','Row0_Column2'],
['Row1_Column0','Row1_Column1','Row1_Column2'],
['Row2_Column0','Row2_Column1','Row2_Column2']
]
def flags(self, index):
return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsEditable
def rowCount(self, parent):
return len(self.items)
def columnCount(self, parent):
return 3
def data(self, index, role):
if not index.isValid(): return QVariant()
row=index.row()
column=index.column()
if row>len(self.items): return QVariant()
if column>len(self.items[row]): …Run Code Online (Sandbox Code Playgroud) 带有:
tableView = QTableView()
rows = [0, 1, 2]
Run Code Online (Sandbox Code Playgroud)
tableView.selectRow(0)否则tableView.selectRow(2)在这种情况下将不起作用,因为selectRow()仅选择单个行,而取消选择所有其他行。
有selectionModel().select()可用的方法。但是它接受QSelectionItems对象作为参数。我们如何声明QSelectionItem具有行号的对象?
我有一个简单的QTableView(不是QTableWidget),具有多个行和列。用户可以单击并在我的QTableView中选择单个单元格。这是我的代码的一部分:
def __init__(self, fileName, parent=None):
QtWidgets.QMainWindow.__init__(self, parent)
self.setupUi(self)
self.gui = form_class
self.model = QtGui.QStandardItemModel(self)
self.tableView.setModel(self.model)
self.tableView.resizeColumnsToContents()
self.tableView.clicked.connect(self.fn_get_cell_Value)
def fn_get_cell_Value(self):
model = self.tableView.model()
data = []
for cell in range(model.SelectedClicked):
data.append([])
value = str(model.data(index))
data[row].append(value)
Run Code Online (Sandbox Code Playgroud)
如何获得此点击的单元格值。谢谢
qtableview ×10
python ×8
pyqt ×7
qt ×4
model ×2
pandas ×2
pyqt5 ×2
pyside ×2
c++ ×1
python-3.x ×1
qheaderview ×1