标签: qtableview

什么是“角色”?它从何而来?(编辑QTableView单元格后如何更改背景颜色?)

我试图在编辑 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)

python pyqt qtableview

3
推荐指数
1
解决办法
4529
查看次数

当模型是 pandas dataframe 时使 QTableView 可编辑

在我的 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)

python qt qtableview pyside pandas

3
推荐指数
1
解决办法
3923
查看次数

可编辑 QTableView 中的 Pandas df:删除复选框

我有一个 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)

python model qtableview pyside pandas

3
推荐指数
1
解决办法
541
查看次数

使用自定义 HeaderView 时列排序不起作用

我正在尝试创建一个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)

python pyqt qtableview qheaderview pyqt5

3
推荐指数
1
解决办法
1248
查看次数

如何使用自定义 QAbstractTableModel 创建 Qtableview 后为单元格着色

我基于 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)

python pyqt qtableview qabstracttablemodel

3
推荐指数
1
解决办法
3876
查看次数

重新排序QTableView时不遵循自定义委托

我正在使用自定义委托在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)

pyqt qtableview qitemdelegate

2
推荐指数
1
解决办法
1457
查看次数

在QTableView中取消选择单行

这似乎应该很容易.基本上我正在实现反转选择功能.

我正在获取所选项目,然后选择所有项目,我想迭代所选项目列表并取消选择它们.如果这不是最好的方式,我愿意接受我的想法,但我想知道的是如何取消选择一个特定的行

QModelIndexList indexs = this->selectedIndexes();
this->selectAll();
foreach(QModelIndex index, indexs)
{
   // Deselect row at index....
}
Run Code Online (Sandbox Code Playgroud)

c++ qt qtableview

2
推荐指数
1
解决办法
4939
查看次数

如何防止双击时清除QTableView项目

使用QAbstractTableModel的flag()方法将QTableView设置为可编辑:

def flags(self, index):
    return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsEditable
Run Code Online (Sandbox Code Playgroud)

双击QTableView的项目将此项目置于编辑模式.默认情况下,预先存在的字符串从字段中消失,整个项目为空白.我想知道这种行为是否可以避免或被覆盖?

在用户双击它之前,这是QTableView字段:

在此输入图像描述

以下是双击时的外观:

在此输入图像描述

编辑工作代码(非常感谢M4rtini):

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)

python qt model pyqt qtableview

2
推荐指数
1
解决办法
1114
查看次数

如何使用selectionModel在QTableView中选择多行

带有:

tableView = QTableView()
rows = [0, 1, 2]
Run Code Online (Sandbox Code Playgroud)

tableView.selectRow(0)否则tableView.selectRow(2)在这种情况下将不起作用,因为selectRow()仅选择单个行,而取消选择所有其他行。

selectionModel().select()可用的方法。但是它接受QSelectionItems对象作为参数。我们如何声明QSelectionItem具有行号的对象?

python qt pyqt selectionmodel qtableview

2
推荐指数
2
解决办法
3151
查看次数

获取QTableView单元格值

我有一个简单的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)

如何获得此点击的单元格值。谢谢

python pyqt qtableview python-3.x pyqt5

2
推荐指数
1
解决办法
1559
查看次数