I hate to answer my own question, but after a couple days I put together a template-based solution that fulfills all of my requirements. Yay for my first from-scratch template class. Here's the implementation:
//modelresetter.h
#include <QAbstractItemModel>
/* you must declare this class as a friend to your model
* to give it access to protected members as follows:
* template <class Model> friend class ModelResetter;
*/
template<class Model>
class ModelResetter
{
public:
ModelResetter(Model* model) : m_model(model)
{
Q_ASSERT_X(qobject_cast<QAbstractItemModel*>(model) != 0, __FUNCTION__,
"templated object does not inherit QAbstractItemModel");
m_model->beginResetModel();
}
~ModelResetter()
{
m_model->endResetModel();
}
private:
Model* m_model;
};
and usage:
//mymodel.cpp
bool MyModel::overhaul()
{
ModelResetter<MyModel> resetter(this); resetter; //prevent compiler warning
//do stuff
if(somethingswrong)
return false; //model will finish reset at every exit point
//do more stuff
return true; //model also completes reset on success
}
Thanks for your help!