我有一个继承自QAbstractListModel的类。现在我想在下面为这个类Liken创建一个信号
BookListModel.h
signals:
void currentIndexChanged(int i);
现在我想在下面的方法中使用它
QVariant BookListModel::data(const QModelIndex &index, int role) const{
int i=index.row();
emit currentIndexChanged();
}
但得到了这个错误:
错误:C2662:' void BookListModel :: currentIndexChanged(int)':无法转换'这个'指针来自' const BookListModel'到BookListModel&'
如何为此类创建当前索引更改信号?
答案 0 :(得分:2)
因为data
函数是const
。
只要宣布你的单一常量,它应该可以工作:
signals:
void currentIndexChanged(int i) const;
请参阅此答案:Is it possible to emit a Qt signal from a const method?
答案 1 :(得分:1)
我想指出,列表模型不应该(并且它不会)对用户操作一无所知,这些操作由视图处理。
假设我们有一个非常简单的模型:
#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
信号以更新视图。该插槽应该连接到由控制视图垂直滚动条的某个对象发出的信号。
所以,让我们在QTableView
ui中布置一个QMainWindow
,然后给窗口一个插槽和一个这样的信号:
public slots:
void scrollValueChanged(int value);
signals:
void scrolledToEnd();
在窗口构造函数中,我们将视图模型设置为Model
类的新实例:
ui->setupUi(this);
Model * model = new Model();
ui->tableView->setModel(model);
然后将视图valueChanged
的{{1}}信号连接到窗口的verticalScrollBar
位置:
scrollValueChanged
和窗口的connect(ui->tableView->verticalScrollBar(), &QScrollBar::valueChanged, this, &MainWindow::scrollValueChanged);
信号到模型的scrolledToEnd
位置:
scrolledToEnd
在窗口槽实现中,如果滚动条达到其最大值,则会发出connect(this, &MainWindow::scrolledToEnd, model, &Model::scrolledToEnd);
信号:
scrolledToEnd
信号将被模型槽捕获,一组新的十个项目将被附加到模型中。