如何在 qt 中为 QAbstractListModel 创建 CurrentIndexChanged 信号?
How create CurrentIndexChanged signal for QAbstractListModel in qt?
我有一个 class 继承自 QAbstractListModel。现在我想为此创建一个信号 class Liken below
BookListModel.h
signals:
void currentIndexChanged(int i);
现在我想在下面的方法中使用它
QVariant BookListModel::data(const QModelIndex &index, int role) const{
int i=index.row();
emit currentIndexChanged();
}
但出现此错误:
error: C2662: 'void BookListModel::currentIndexChanged(int)': cannot convert 'this' pointer from 'const BookListModel' to 'BookListModel &'
我如何为这个 class 创建当前指数变化信号?
因为data
函数是const
。
只需声明您的信号常量,它就可以工作:
signals:
void currentIndexChanged(int i) const;
看到这个答案:Is it possible to emit a Qt signal from a const method?
我要指出的是,列表模型不应该(现在也确实如此)对由视图处理的用户操作一无所知。
假设我们有一个像这样的非常简单的模型:
#include <QAbstractListModel>
class Model : public QAbstractListModel
{
Q_OBJECT
QStringList list;
public:
Model()
{
//adds 100 items
for(int i=0; i<100; i++)
list << QString("ITEM #") + QString::number(i+1);
}
int rowCount(const QModelIndex &parent) const
{
return list.size();
}
QVariant data(const QModelIndex &index, int role) const
{
if(index.isValid() && (role == Qt::DisplayRole))
{
int row = index.row();
if(row < list.size())
{
return list[row];
}
}
return QVariant();
}
public slots:
void scrolledToEnd()
{
//adds 10 more items
int count = list.size();
for(int i=count; i<(count + 10); i++)
list << QString("ITEM #") + QString::number(i+1);
emit layoutChanged();
}
};
如您所见,我添加了一个 scrolledToEnd
插槽,当用户将视图滚动到末尾时调用。额外的项目被添加到模型中并发出 layoutChanged
信号来更新视图。该插槽应该连接到某个控制视图垂直滚动条的对象发出的信号。
所以,让我们在 QMainWindow
ui 中布置一个 QTableView
,并给 window 一个插槽和一个信号,如下所示:
public slots:
void scrollValueChanged(int value);
signals:
void scrolledToEnd();
在 window 构造函数中,我们将视图模型设置为 Model
class:
的新实例
ui->setupUi(this);
Model * model = new Model();
ui->tableView->setModel(model);
然后将视图verticalScrollBar
的valueChanged
信号连接到window的scrollValueChanged
插槽:
connect(ui->tableView->verticalScrollBar(), &QScrollBar::valueChanged, this, &MainWindow::scrollValueChanged);
和window的scrolledToEnd
信号到模型的scrolledToEnd
插槽:
connect(this, &MainWindow::scrolledToEnd, model, &Model::scrolledToEnd);
在window插槽实现中,如果滚动条达到最大值,则发出scrolledToEnd
信号:
void MainWindow::scrollValueChanged(int value)
{
if(value==ui->tableView->verticalScrollBar()->maximum())
{
emit scrolledToEnd();
}
}
信号将被模型插槽捕获,一组新的 10 个项目将附加到模型。
我有一个 class 继承自 QAbstractListModel。现在我想为此创建一个信号 class Liken below
BookListModel.h
signals:
void currentIndexChanged(int i);
现在我想在下面的方法中使用它
QVariant BookListModel::data(const QModelIndex &index, int role) const{
int i=index.row();
emit currentIndexChanged();
}
但出现此错误:
error: C2662: 'void BookListModel::currentIndexChanged(int)': cannot convert 'this' pointer from 'const BookListModel' to 'BookListModel &'
我如何为这个 class 创建当前指数变化信号?
因为data
函数是const
。
只需声明您的信号常量,它就可以工作:
signals:
void currentIndexChanged(int i) const;
看到这个答案:Is it possible to emit a Qt signal from a const method?
我要指出的是,列表模型不应该(现在也确实如此)对由视图处理的用户操作一无所知。
假设我们有一个像这样的非常简单的模型:
#include <QAbstractListModel>
class Model : public QAbstractListModel
{
Q_OBJECT
QStringList list;
public:
Model()
{
//adds 100 items
for(int i=0; i<100; i++)
list << QString("ITEM #") + QString::number(i+1);
}
int rowCount(const QModelIndex &parent) const
{
return list.size();
}
QVariant data(const QModelIndex &index, int role) const
{
if(index.isValid() && (role == Qt::DisplayRole))
{
int row = index.row();
if(row < list.size())
{
return list[row];
}
}
return QVariant();
}
public slots:
void scrolledToEnd()
{
//adds 10 more items
int count = list.size();
for(int i=count; i<(count + 10); i++)
list << QString("ITEM #") + QString::number(i+1);
emit layoutChanged();
}
};
如您所见,我添加了一个 scrolledToEnd
插槽,当用户将视图滚动到末尾时调用。额外的项目被添加到模型中并发出 layoutChanged
信号来更新视图。该插槽应该连接到某个控制视图垂直滚动条的对象发出的信号。
所以,让我们在 QMainWindow
ui 中布置一个 QTableView
,并给 window 一个插槽和一个信号,如下所示:
public slots:
void scrollValueChanged(int value);
signals:
void scrolledToEnd();
在 window 构造函数中,我们将视图模型设置为 Model
class:
ui->setupUi(this);
Model * model = new Model();
ui->tableView->setModel(model);
然后将视图verticalScrollBar
的valueChanged
信号连接到window的scrollValueChanged
插槽:
connect(ui->tableView->verticalScrollBar(), &QScrollBar::valueChanged, this, &MainWindow::scrollValueChanged);
和window的scrolledToEnd
信号到模型的scrolledToEnd
插槽:
connect(this, &MainWindow::scrolledToEnd, model, &Model::scrolledToEnd);
在window插槽实现中,如果滚动条达到最大值,则发出scrolledToEnd
信号:
void MainWindow::scrollValueChanged(int value)
{
if(value==ui->tableView->verticalScrollBar()->maximum())
{
emit scrolledToEnd();
}
}
信号将被模型插槽捕获,一组新的 10 个项目将附加到模型。