я кажется примерно понял в чем дело (прокси моделями, тем более кастомными, раньше не пользовался). прокси модель ничего не знает о новой строке т.к. для нее не существует индекса. после добавления следующих методов данные в новой строке начали отображаться когда кликаешь на чекбокс.
C++ (Qt)
QModelIndex TableModel::mapFromSource(const QModelIndex& sourceIndex) const
{
return sourceIndex;
}
QModelIndex TableModel::mapToSource(const QModelIndex& proxyIndex) const
{
return proxyIndex.row() < 3 ? proxyIndex : QModelIndex{};
}
QModelIndex TableModel::index(int row, int column, const QModelIndex& parent) const
{
return row < 3 ? QSortFilterProxyModel::index(row, column, parent) : createIndex(row, column);
}
там правда дальше программа падает при клике на новую строчку (падает внутренний вызов метода parent()), я уже не стал дальше копаться.
также у тебя beginInsertRows вызывается с неправильными параметрами для вставки в конец, надо
C++ (Qt)
const auto rows = QSortFilterProxyModel::rowCount();
beginInsertRows(QModelIndex(), rows, rows + newValues.size() - 1);
а beginResetModel/endResetModel там вообще не нужны.
метод setData тоже написан не совсем правильно, должно быть так:
C++ (Qt)
bool TableModel::setData(const QModelIndex & index, const QVariant & value, int role)
{
if(static_cast<headers>(index.column()) == headers::Check && role == Qt::CheckStateRole)
{
checkbox.setCheck(index.row(), value.toBool());
emit dataChanged(index, index, {role});
return true;
}
return QSortFilterProxyModel::setData(index, value, role);
}
еще у тебя метод data немножко коряво написан: обрати внимание на странную фигурную скобку в конце этой строки
https://github.com/SavchenkoAndreyV/ProxyModel/blob/main/ProxyModel/tablemodel.cpp#L48 Отформатируй по-человечески этот метод.
также в конструкторе MainWindow соединение с сигналом clicked не нужно — это и так происходит неявным образом за счет вызова метода connectSlotsByName. из-за этого у тебя обработчик дважды подряд срабатывает.