Как создать сигнал CurrentIndexChanged для QAbstractListModel в qt?
У меня есть класс, который унаследован от 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 &"
Как я могу создать текущий сигнал изменения индекса для этого класса?
2 ответа
Это потому что data
функция const
, Просто объявите ваш константный сингл, и он должен работать:
signals:
void currentIndexChanged(int i) const;
Смотрите этот ответ: возможно ли испускать сигнал Qt из метода const?
Я хотел бы отметить, что модель списка не должна (и не знает) ничего о действиях пользователя, которые обрабатываются представлением.
Предположим, у нас есть очень простая модель, подобная этой:
#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
в QMainWindow
UI, и дать окну слот и сигнал, как эти:
public slots:
void scrollValueChanged(int value);
signals:
void scrolledToEnd();
В конструкторе окна мы устанавливаем модель представления на новый экземпляр нашего Model
учебный класс:
ui->setupUi(this);
Model * model = new Model();
ui->tableView->setModel(model);
затем подключите valueChanged
сигнал зрения verticalScrollBar
к scrollValueChanged
щель окна:
connect(ui->tableView->verticalScrollBar(), &QScrollBar::valueChanged, this, &MainWindow::scrollValueChanged);
и scrolledToEnd
сигнал окна к scrolledToEnd
слот модели:
connect(this, &MainWindow::scrolledToEnd, model, &Model::scrolledToEnd);
В реализации слота окна, если полоса прокрутки достигла своего максимального значения, scrolledToEnd
сигнал испускается:
void MainWindow::scrollValueChanged(int value)
{
if(value==ui->tableView->verticalScrollBar()->maximum())
{
emit scrolledToEnd();
}
}
Сигнал будет пойман в слоте модели, и к модели добавится новый набор из десяти предметов.