我有一个QAbstractTableModel基于简单的模型和一个QTableView。
我的目标也很简单:允许通过拖放移动/重新排序行。笔记:
QTableView应该反映在我的模型中;我真的很接近我的目标。但它仍然没有像我预期的那样工作。现在我可以拖动行,但似乎任何单元格都可以接受拖放,尽管我Qt::ItemIsDropEnabled只为全局表的父级指定了此标志,并且没有为实际表项指定此标志,因为我不想拖放到它们,我想以某种方式删除“行之间”,只是为了执行行移动。因为表格项目出于某种原因可以接受删除,所以我得到了奇怪的行为:如果删除到任何行的第一个单元格,我就完全实现了我想要的:我的行移动正确。但是如果我掉到任何行的非第一个单元格,它就会完全错误。但最好展示一下这里发生的事情的图片:
我的代码(正是我的问题的最小样本):
主程序
void setupView(QTableView &t)
{
t.verticalHeader()->hide();
t.horizontalHeader()->hide();
t.horizontalHeader()->setStretchLastSection(true);
t.setSelectionBehavior(QAbstractItemView::SelectRows);
t.setSelectionMode(QAbstractItemView::SingleSelection);
t.setDragEnabled(true);
t.setDropIndicatorShown(true);
t.setAcceptDrops(true);
t.viewport()->setAcceptDrops(true);
t.setDefaultDropAction(Qt::MoveAction);
t.setDragDropMode(QTableView::InternalMove);
t.setDragDropOverwriteMode(false);
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow w;
QTableView *table = new QTableView(&w);
setupView(*table);
table->setModel(new TableModel);
w.setCentralWidget(table);
w.show();
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
表模型.cpp
#include "tablemodel.h" …Run Code Online (Sandbox Code Playgroud) 我从 QAbstractTableModel 派生了一个模型,现在我想通知,整行的数据已更改。例如,如果索引为 5 的行的数据发生更改(4 列),则使用以下代码可以按预期工作。
emit dataChanged(index(5,0), index(5, 0));
emit dataChanged(index(5,1), index(5, 1));
emit dataChanged(index(5,2), index(5, 2));
emit dataChanged(index(5,3), index(5, 3));
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试仅使用一次发出来实现相同的目的,则视图中所有行的所有列都会更新。
emit dataChanged(index(5, 0), index(5, 3));
Run Code Online (Sandbox Code Playgroud)
我在这里做错了什么?
演示.h
#pragma once
#include <QAbstractTableModel>
#include <QTime>
#include <QTimer>
class Demo : public QAbstractTableModel
{
Q_OBJECT
QTimer * t;
public:
Demo()
{
t = new QTimer(this);
t->setInterval(1000);
connect(t, SIGNAL(timeout()) , this, SLOT(timerHit()));
t->start();
}
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override …Run Code Online (Sandbox Code Playgroud) 此代码创建单个QTableView. 单击该列将显示指示列排序方向的箭头。单击 tableView 的项目本身会打印出单击的索引。单击 tableView 项时,我想知道三列(标题)中的哪一列是当前的(显示箭头的列)以及排序箭头指向的方向:向上或向下。如何实现这一目标?
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
class Model(QtCore.QAbstractTableModel):
def __init__(self):
QtCore.QAbstractTableModel.__init__(self)
self.items = [[1, 'one', 'ONE'], [2, 'two', 'TWO'], [3, 'three', 'THREE']]
def rowCount(self, parent=QtCore.QModelIndex()):
return 3
def columnCount(self, parent=QtCore.QModelIndex()):
return 3
def data(self, index, role):
if not index.isValid(): return
if role in [QtCore.Qt.DisplayRole, QtCore.Qt.EditRole]:
return self.items[index.row()][index.column()]
def onClick(index):
print 'clicked index: %s'%index
def sortIndicatorChanged(column=None, sortOrder=None):
print 'sortIndicatorChanged: column: %s, sortOrder: %s'%(column, sortOrder)
tableModel=Model()
tableView=QtGui.QTableView()
tableView.setModel(tableModel)
tableView.setSortingEnabled(True)
tableView.clicked.connect(onClick)
tableView.horizontalHeader().sortIndicatorChanged.connect(sortIndicatorChanged)
tableView.show() …Run Code Online (Sandbox Code Playgroud) 我创建了一个基于 QAbstractTableModel 的模型,允许用户编辑该模型中的数据。该模型显示在 QMainWindow 中的 QTableView 中。到目前为止,在我的模型中,我能够使单元格可编辑,并在编辑完成后保存用户输入的任何内容。
问题是当用户开始编辑时,它会“清除”该单元格的先前内容。因此,例如,如果我只想更改单元格中字符串的拼写,则必须重新键入整个值。我希望在编辑时编辑器将从模型中已有的数据开始,而不是空的。
我怎样才能做到这一点?
问题示例:
在我开始编辑单元格之前:
我一开始编辑,单元格就是空的。我希望它以模型中已有的先前值作为星标:
这是我的模型的最小示例。我的实际模型要大得多,并且使用结构而不是 QVariants 的二维数组来存储数据。
标题:
const int COLS= 2;
const int ROWS= 6;
class EditableTableModel : public QAbstractTableModel
{
Q_OBJECT
private:
QVariant tableData[ROWS][COLS];
public:
EditableTableModel(QObject *parent = nullptr);
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
QVariant headerData(int section, …Run Code Online (Sandbox Code Playgroud) 我正在实现QAbstractTableModel,我想QPushButton在每行的最后一列插入一个.当用户单击此按钮时,将显示一个新窗口,其中包含有关此行的更多信息.
你知道如何插入按钮吗?我知道委派系统,但所有的例子都只是关于"如何使用组合框编辑颜色"......
我有一个QTableView用我自己的模型子类实现的QAbstractTableModel. 当行中的某个字段具有特定值时,我希望能够将行颜色更改为红色。我看到很多例子,答案是调用模型setData并用于Qt::BackgroundRole更改背景颜色。由于我对AbstractTableModel我重新实现进行了子类化setData,data因此调用模型setData对背景颜色角色没有任何作用,因为我只处理角色为 的数据Qt::DisplayRole。
我想我的第一个问题是:有没有更简单的方法来改变整个角色的颜色?如果没有,我猜我必须实现该部分setData并data处理BackgroundRole我不知道该怎么做的情况,如果有人有关于如何做到这一点的示例,那真的会有很大帮助......
我有一个QTableView.
有没有办法对齐中心,这个视图的所有单元格内容?
我没有使用任何代表.它只是AbstractTableModel作为模型添加到一个QTableView.
我应该如何将每个细胞内容与中心对齐?
谢谢.
我有需要在QTreeView中显示的自定义数据.我从QAbstractTableModel派生了我的模型,并自己实现了rowCount(),columnCount(),data()和headerData().模型具有本地QList>以支持它,并且data()函数被定义为从与QModelIndex参数中接收的行和列直接对应的列表列表中读取值.我遇到了两个问题.
首先是一个非常大的文件的负载很慢,这是可以理解的.第二个是滚动动作非常缓慢,我并不是真正理解.事实证明,如果我向下拉动滚动手柄,GUI会挂起大约20秒,然后弹出.如果我向下拉动手柄更长的距离,则挂起时间会相应增加.如果我将手柄一直拉到滚动条的底部,等待应用程序再次响应之后,我可以上下拉动手柄并获得更好的响应.
在我看来,QTreeView只需要一小部分可用数据,但是当我将滚动手柄一直拉到滚动条的底部时,一旦应用程序再次响应,它就会在那一点上读取所有数据.
有没有办法通过滚动大数据来编写更具响应性的体验?我不介意在前面等待更长时间,所以只需要强制视图从模型中预先读取所有数据就可以了.
我还想过,我可以回到刚刚从QAbstractItemView派生并控制它如何请求和存储数据,只允许存储查看的数据,以及查看数据之前和之后的条目缓冲区.那当然意味着我必须控制滚动条,因为句柄大小会指示少量数据,我希望它能够看到用户应该处理的数据大小.如果我不需要,不是真的想去那里.
我基于 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) 我正在 PyQt5 中编写一个自定义 TableModel,继承自QtCore.QAbstractTableModel. 我希望我的表格有一列仅包含复选框,没有文本,一列每行都有一个按钮。
我尝试在该角色的方法中返回一个QPushButton对象,但显然这是不可能的。dataQt.Display
所以我的问题是:我可以在模型本身中实现它为某些单元格返回某些小部件吗?在我看来,这是模型的工作,但我如何实现这一点呢?
我的第二个问题是我必须如何分配插槽,以便我知道操作是从哪个按钮(从哪一行)发生的?
我希望我的AbstracttableModel子类data()方法返回html,即
PreText<b>Text</b>PostText
Run Code Online (Sandbox Code Playgroud)
并且此文本必须在html中显示为int表:PreText Text PostText
我怎样才能做到这一点?
qt qabstractitemmodel qabstracttablemodel qabstractlistmodel