Как создать сигнал 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();
    }
}

Сигнал будет пойман в слоте модели, и к модели добавится новый набор из десяти предметов.

Другие вопросы по тегам