J'ai étudié, que ce comportement méchant est de par sa conception. Les lignes sont supprimées du modèle lors de la validation, et aucune vue ne sait, quelles lignes doivent être dessinées et lesquelles ne le sont pas. La seule chose à faire lorsque les lignes retirées du modèle est '!' marqueur dans header.model(). headerData (index, vert) .text(). Et c'est dégueulasse.
J'ai honte la façon dont je résolu le problème, mais voici mon bidouille horrible:
from PyQt4 import QtGui
from PyQt4 import QtSql
from PyQt4 import QtCore
class SqlTableView(QtGui.QTableView):
'''
Представление, которое не показывает удалённые столбцы,
когда коммит ещё не прошёл
'''
def __init__(self, parent = None):
'''
Конструктор
'''
QtGui.QTableView.__init__(self, parent)
def setModel(self, model):
'''
Мы не можем соединиться с моделями, не являющимися QSqlTableModel
'''
assert isinstance(model, QtSql.QSqlTableModel)
QtGui.QTableView.setModel(self, model)
def paintEvent(self, event):
'''
Тут всё и происходит. Осторожно, может стошнить.
'''
if self.model() is not None:
header = self.verticalHeader()
hm = header.model()
for i in range(hm.rowCount()):
if (hm.headerData(i, QtCore.Qt.Vertical).toPyObject() == '!'
and not header.isSectionHidden(i)):
header.hideSection(i)
elif (header.isSectionHidden(i) and
hm.headerData(i, QtCore.Qt.Vertical).toPyObject() != '!'):
header.showSection(i)
PyQt4.QtGui.QTableView.paintEvent(self, event)
J'ai aussi ajouté à QtDesigner pour simplifier la conception d'interface.
Deuxième solution, pas si méchant:
class PSqlRelationalTableModel : public QSqlRelationalTableModel
{
Q_OBJECT
public:
explicit PSqlRelationalTableModel(QObject *parent = 0,
QSqlDatabase db = QSqlDatabase());
virtual ~PSqlRelationalTableModel();
bool removeRows(int row, int count,
const QModelIndex &parent = QModelIndex());
public slots:
void revertRow(int row);
signals:
void rowIsMarkedForDeletion(int index);
void rowDeletionMarkRemoved(int index);
private:
QSet<unsigned int> rowsToDelete;
};
//////////////////////////////////////////////////////////////////
void PTableView::setModel(PSqlRelationalTableModel *model)
{
connect(model, SIGNAL(rowIsMarkedForDeletion(int)),
this, SLOT(onRowMarkedForDeletion(int)));
connect(model, SIGNAL(rowDeletionMarkRemoved(int)),
this, SLOT(onRowDeletionMarkRemoved(int)));
QTableView::setModel(model);
}
void PTableView::onRowMarkedForDeletion(int index)
{
QHeaderView *hv = verticalHeader();
hv->hideSection(index);
}
void PTableView::onRowDeletionMarkRemoved(int index)
{
QHeaderView *hv = verticalHeader();
hv->showSection(index);
}
Ou 'beginRemoveRows' et' endRemoveRows'. – andref
QSqlRelationalTableModel possède déjà des lignes de suppression, implémentées correctement avec beginRemoveRows et endRemoveRows. –
J'ai étudié, que ce comportement méchant est par conception. Les lignes sont supprimées du modèle lors de la validation, et aucune vue ne sait, quelles lignes doivent être dessinées et lesquelles ne le sont pas. La seule chose à faire lorsque les lignes retirées du modèle est '!' marqueur dans header.model(). headerData (index, vert) .text() Et c'est dégoûtant. Je шьздуьутеув la solution de contournement et l'afficherai ici plus tard. –