在Qt中将数据从QAbstractTableModel初始化为自定义模型
Initialising data into custom model from QAbstractTableModel in Qt?
我是Qt模型/视图框架的初学者。我在将QAbstractTableModel子类(MyModel(与QTableView一起使用时遇到问题。创建MyModel对象后,我想将其设置为具有2行和2列。我有一个初始化函数,它设置所有类变量,然后发出 dataChanged(( SIGNAL,但视图仍然没有显示任何内容。
class MyModel : QAbstractTableModel
{
public:
MyModel();
Initialise(double **a, int r, int c);
private:
int row;
int column;
double **array;
}
MyModel::Initialise(double **a, int r, int c)
{
array = a;
row = r;
column = c;
emit dataChanged(index(0, 0), index(r - 1, c - 1));
}
我已经重新实现了只读访问所需的所有功能。但我仍然得到一个空白窗口。出于说明目的,在记事本中创建了上述代码,因此请忽略语法错误。我在Qt SDK中找不到任何从QAbstractTableModel创建自定义模型的示例。因此,请让我知道将数据初始化为模型的正确方法是什么。
编辑:
QVariant TableModel::data(const QModelIndex &index, int role) const
{
if(!index.isValid())
return QVariant();//currently it is returning from here, why???
switch(role)
{
case Qt::DisplayRole:
{
if(index.column()==0)
return QString::number(array[index.row()][index.column()]);
break;
}
}
}
dataChanged
信号强制视图更新现有项目。它不会告诉它行或列计数已更改。您应该改用layoutAboutToBeChanged
和layoutChanged
信号。您可以在没有任何参数的情况下使用它们。
确保您正确实现了rowCount
和columnCount
虚拟功能。
我不知道为什么index.isValid()
在你的函数中是错误的。检查索引的model()
、row()
和column()
属性,找出它无效的原因。通常,视图可以使用任意参数调用data
函数。由于您的视图认为您的模型为空,因此所有索引很可能都是无效的。当您在视图中看到任何行和列时,您将开始收到有效的索引。
此外,如果初始化只执行一次,则最好在将模型分配给视图之前执行。
并且不要使用double**
.使用自动内存管理(例如 QVector
(改为。毕竟,这是C++。
要初始化表中的数据,您必须重新定义数据函数,rowCount和clumnCount以及Model的构造函数。假设你有在构造函数中初始化的数据 int mydataarray[r][c]。
TableModel::TableModel(int r,int c, double **initialdata)
{
R = r;
C = c;
mydataarray= initialdata;
}
QVariant TableModel::data(const QModelIndex &index, int role) const
{
switch(role)
{
case Qt::DisplayRole:
if(index.column()==0)
{
return QString::number(maydataarray[index.row()][index.column()]);
}
break;
}
设置行数和列数重定义
int TableModel::rowCount(const QModelIndex &parent= QModelIndex()) const
{
return R;//R is number of initial rows
}
int TableModel::columnCount(const QModelIndex &parent= QModelIndex()) const
{
return C;//C is number of initial columns
}
在初始化函数中,实际上您可以使用它进行修改,但如果行和列超过初始 R 和 C 时,您必须在模型中插入行和列
void TableModel::Initialize(double **a, int r, int c)
{
QModelIndex m = createIndex(0,0);
if(r>this->rowCount(m)||c>this->columnCount(m))
{
QMessageBox m1;
m1.setText("Exciding r/c "+ QString::number(m.row())+QString::number(m.column()));
m1.exec();
return;//add logic to insert exceeding rows and columns here before calling dataChange() function
}
mydataarray =a;
QModelIndex n = createIndex(r-1,c-1);
this->dataChanged(createIndex(0,0),n);
}
请参阅此内容以获取进一步内容
- 参数化自定义CMake工具链
- 初始化类定义中的结构数组
- 如果构造函数被显式默认或删除,为什么聚合初始化自 C++20 以来不再起作用
- 初始化自定义类型构造函数的数组
- 使用没有默认构造函数的类/类型初始化自定义容器
- 在类构造函数中初始化自定义结构对象的正确方法
- 在初始化时定义了具有不同行为的C++成员函数
- C++值初始化自定义容器的项
- C++ 初始化结构定义中的向量
- 如何初始化和定义指向指针 2D 数组的指针
- 模板函数实例化 自定义数据类型的问题
- 如果有多个结构数组,如何使用初始化列表定义结构变量的成员
- 在Qt中将数据从QAbstractTableModel初始化为自定义模型
- 常量静态成员初始化 - 类定义内部与外部类定义
- C++ 为什么我可以初始化静态常量字符,但不能初始化类定义中的静态常量双精度
- 在自定义类中实例化自定义类时出现"expected type-specifier"错误
- 继承类使用非默认构造函数初始化自定义类
- 如何在c++中初始化自定义结构体的动态数组
- 初始化自定义类中的数组
- 我什么时候用cocos2d-x中的参数初始化自定义创建函数中的变量?