标签: qabstracttablemodel

QTableView + QAbstractTableModel:通过拖放移动行

我有一个QAbstractTableModel基于简单的模型和一个QTableView

我的目标也很简单:允许通过拖放移动/重新排序行。笔记:

  • D'n'd里面的变化QTableView应该反映在我的模型中;
  • D'n'd 应该是内部的 - 移动应该只在我的视图内执行,没有外部 MIME 导出;
  • 我想拖放行。单独项目应该不会拖或丢弃;
  • 拖动水平标题对我来说不是一个合适的解决方案,因为我想要隐藏标题并且因为我想让用户在任何地方抓取行来拖动它;

我真的很接近我的目标。但它仍然没有像我预期的那样工作。现在我可以拖动行,但似乎任何单元格都可以接受拖放,尽管我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)

c++ qt drag-and-drop qtableview qabstracttablemodel

6
推荐指数
1
解决办法
3066
查看次数

QAbstractTableModel 并为单行发出 dataChanged

我从 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)

我在这里做错了什么?

最小示例(C++11、QTCreator 4.7.1、Windows 10 (1803)、64 位)

演示.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)

c++ qt row onchange qabstracttablemodel

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

如何获取QTableView当前列及其排序方向

在此输入图像描述

此代码创建单个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)

python qtableview qabstracttablemodel

5
推荐指数
0
解决办法
1153
查看次数

QAbstractTableModel 编辑而不清除单元格中的先前数据

我创建了一个基于 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)

c++ qt qtableview qabstracttablemodel qt5

5
推荐指数
1
解决办法
1302
查看次数

如何将QPushButton插入TableView?

我正在实现QAbstractTableModel,我想QPushButton在每行的最后一列插入一个.当用户单击此按钮时,将显示一个新窗口,其中包含有关此行​​的更多信息.

你知道如何插入按钮吗?我知道委派系统,但所有的例子都只是关于"如何使用组合框编辑颜色"......

qt qt4 qabstracttablemodel

4
推荐指数
1
解决办法
8295
查看次数

QTableView 根据值更改行颜色

我有一个QTableView用我自己的模型子类实现的QAbstractTableModel. 当行中的某个字段具有特定值时,我希望能够将行颜色更改为红色。我看到很多例子,答案是调用模型setData并用于Qt::BackgroundRole更改背景颜色。由于我对AbstractTableModel我重新实现进行了子类化setDatadata因此调用模型setData对背景颜色角色没有任何作用,因为我只处理角色为 的数据Qt::DisplayRole

我想我的第一个问题是:有没有更简单的方法来改变整个角色的颜色?如果没有,我猜我必须实现该部分setDatadata处理BackgroundRole我不知道该怎么做的情况,如果有人有关于如何做到这一点的示例,那真的会有很大帮助......

c++ qt qtableview qabstracttablemodel

4
推荐指数
1
解决办法
7728
查看次数

中心在QTableView中对齐单元格的内容

我有一个QTableView.

有没有办法对齐中心,这个视图的所有单元格内容?

我没有使用任何代表.它只是AbstractTableModel作为模型添加到一个QTableView.

我应该如何将每个细胞内容与中心对齐?

谢谢.

qt qtableview qabstracttablemodel

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

Qt5 QTreeView具有自定义模型和大数据非常慢的滚动

我有需要在QTreeView中显示的自定义数据.我从QAbstractTableModel派生了我的模型,并自己实现了rowCount(),columnCount(),data()和headerData().模型具有本地QList>以支持它,并且data()函数被定义为从与QModelIndex参数中接收的行和列直接对应的列表列表中读取值.我遇到了两个问题.

首先是一个非常大的文件的负载很慢,这是可以理解的.第二个是滚动动作非常缓慢,我并不是真正理解.事实证明,如果我向下拉动滚动手柄,GUI会挂起大约20秒,然后弹出.如果我向下拉动手柄更长的距离,则挂起时间会相应增加.如果我将手柄一直拉到滚动条的底部,等待应用程序再次响应之后,我可以上下拉动手柄并获得更好的响应.

在我看来,QTreeView只需要一小部分可用数据,但是当我将滚动手柄一直拉到滚动条的底部时,一旦应用程序再次响应,它就会在那一点上读取所有数据.

有没有办法通过滚动大数据来编写更具响应性的体验?我不介意在前面等待更长时间,所以只需要强制视图从模型中预先读取所有数据就可以了.

我还想过,我可以回到刚刚从QAbstractItemView派生并控制它如何请求和存储数据,只允许存储查看的数据,以及查看数据之前和之后的条目缓冲区.那当然意味着我必须控制滚动条,因为句柄大小会指示少量数据,我希望它能够看到用户应该处理的数据大小.如果我不需要,不是真的想去那里.

qt qtreeview qabstracttablemodel qt5

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

如何使用自定义 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
查看次数

Qt 模型/视图表中的按钮

我正在 PyQt5 中编写一个自定义 TableModel,继承自QtCore.QAbstractTableModel. 我希望我的表格有一列仅包含复选框,没有文本,一列每行都有一个按钮。

我尝试在该角色的方法中返回一个QPushButton对象,但显然这是不可能的。dataQt.Display

所以我的问题是:我可以在模型本身中实现它为某些单元格返回某些小部件吗?在我看来,这是模型的工作,但我如何实现这一点呢?

我的第二个问题是我必须如何分配插槽,以便我知道操作是从哪个按钮(从哪一行)发生的?

python pyqt qtableview qabstracttablemodel pyqt5

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

QAbstractTableModel数据返回HTML代码以显示

我希望我的AbstracttableModel子类data()方法返回html,即

PreText<b>Text</b>PostText
Run Code Online (Sandbox Code Playgroud)

并且此文本必须在html中显示为int表:PreText Text PostText

我怎样才能做到这一点?

qt qabstractitemmodel qabstracttablemodel qabstractlistmodel

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