C++ QSqlTableModel继承表中出错
我有一个从QSqlTableModel继承的类,它在调用submitAll()插槽之后,在调用insertPoint几次之后中断。这是代码 谢谢你的帮助 问候C++ QSqlTableModel继承表中出错,c++,qt4,C++,Qt4,我有一个从QSqlTableModel继承的类,它在调用submitAll()插槽之后,在调用insertPoint几次之后中断。这是代码 谢谢你的帮助 问候 #ifndef VWLANDMARKTABLEMODEL_H #define VWLANDMARKTABLEMODEL_H #include <QSqlTableModel> class GraphicsPointLandmarkItem; class VWLandmarkTableModel : public QSql
#ifndef VWLANDMARKTABLEMODEL_H
#define VWLANDMARKTABLEMODEL_H
#include <QSqlTableModel>
class GraphicsPointLandmarkItem;
class VWLandmarkTableModel : public QSqlTableModel
{
Q_OBJECT
public:
enum Column {
IdColumn=0,
IdImageColumn=1,
UsernameColumn=2,
NameColumn=3,
DefinitionColumn=4
};
VWLandmarkTableModel(QObject *parent=0);
int idImage() const { return m_idImage; }
QString username() const { return m_username; }
void setIdImage(int idImage);
void setUsername(const QString &username);
virtual bool select();
bool insertPoint(GraphicsPointLandmarkItem *item);
signals:
protected:
virtual void setFilter(const QString &filter)
{ QSqlTableModel::setFilter(filter); }
virtual bool insertRowIntoTable(const QSqlRecord &values);
protected slots:
void setDefaults(int row, QSqlRecord &r);
private:
QString m_username;
int m_idImage;
};
#endif // VWLANDMARKTABLEMODEL_H
#include "vwlandmarktablemodel.h"
#include <QtGui>
#include <QtSql>
#include <QtCore>
#include "graphicspointlandmarkitem.h"
VWLandmarkTableModel::VWLandmarkTableModel(QObject *parent)
: QSqlTableModel(parent)
{
setTable("vwLandmark");
setEditStrategy(OnManualSubmit);
connect(this, SIGNAL(primeInsert(int,QSqlRecord&)),
SLOT(setDefaults(int,QSqlRecord&)));
}
void VWLandmarkTableModel::setIdImage(int idImage)
{ m_idImage=idImage; }
void VWLandmarkTableModel::setUsername(const QString &username)
{ m_username=username; }
bool VWLandmarkTableModel::select()
{
Q_ASSERT(!username().isEmpty());
QString stmt="IdImage = %1 AND Username = '%2'";
setFilter(stmt.arg(idImage()).arg(username()));
return QSqlTableModel::select();
}
bool VWLandmarkTableModel::insertPoint(GraphicsPointLandmarkItem *item)
{
QString text;
QTextStream out(&text);
int row=rowCount();
bool ok;
ok=insertRow(row); Q_ASSERT(ok);
QModelIndex idx=index(row, DefinitionColumn);
out<<*item;
ok=setData(idx, text);
Q_ASSERT(ok);
idx=index(row, NameColumn);
ok=setData(idx, tr("New point landmark"));
Q_ASSERT(ok);
return ok;
}
bool VWLandmarkTableModel::insertRowIntoTable(const QSqlRecord &values)
{
QString sql="EXEC InsertLandmark :IdImage,:Definition";
QSqlQuery q;
bool ok;
ok=q.prepare(sql); Q_ASSERT(ok);
q.bindValue(":IdImage", values.value("IdImage"));
q.bindValue(":Definition", values.value("Definition"));
q.setForwardOnly(true);
if(!q.exec()) {
setLastError(q.lastError());
return false;
}
qDebug()<<"hola mundo";
return true;
}
void VWLandmarkTableModel::setDefaults(int row, QSqlRecord &r)
{
r.setValue("IdImage", idImage());
r.setValue("Name", "Unnamed landmark");
r.setValue("Username", username());
}
\ifndef VWLANDMARKTABLEMODEL\u H
#定义VWLANDMARKTABLEMODEL_H
#包括
类GraphicsPointLandmarkItem;
VWLandmarkTableModel类:公共QSqlTableModel
{
Q_对象
公众:
枚举列{
IdColumn=0,
IdImageColumn=1,
UsernameColumn=2,
NameColumn=3,
定义列=4
};
VWLandmarkTableModel(QObject*parent=0);
int idImage()常量{返回m_idImage;}
QString username()常量{return m_username;}
无效设置idImage(int idImage);
void setUsername(常量QString和username);
虚拟布尔选择();
布尔插入点(GraphicsPointLandmarkItem*item);
信号:
受保护的:
虚拟void setFilter(常量QString和filter)
{QSqlTableModel::setFilter(filter);}
虚拟bool insertRowIntoTable(常量QSqlRecord&value);
受保护插槽:
void setDefaults(int行、QSqlRecord&r);
私人:
QString m_用户名;
国际图像;
};
#endif//VWLANDMARKTABLEMODEL_H
#包括“vwlandmarktablemodel.h”
#包括
#包括
#包括
#包括“graphicspointlandmarkitem.h”
VWLandmarkTableModel::VWLandmarkTableModel(QObject*父对象)
:QSqlTableModel(父级)
{
可设置(“vwLandmark”);
setEditStrategy(OnManualSubmit);
连接(此,信号(primeInsert(int,QSqlRecord&)),
插槽(setDefaults(int,QSqlRecord&));
}
void VWLandmarkTableModel::setIdImage(intIDimage)
{m_idImage=idImage;}
void VWLandmarkTableModel::setUsername(常量QString和username)
{m_username=username;}
bool VWLandmarkTableModel::select()
{
Q_断言(!username().isEmpty());
QString stmt=“IdImage=%1和用户名='%2';
setFilter(stmt.arg(idImage()).arg(username());
返回QSqlTableModel::select();
}
bool VWLandmarkTableModel::insertPoint(GraphicsPointLandmarkItem*item)
{
QString文本;
QTextStream out(文本(&T);
int row=rowCount();
布尔ok;
ok=插入行(row);Q_断言(ok);
QModelIndex idx=索引(行,定义列);
out问题出在我的自定义选择中。调用setFilter()会导致无限调用循环问题出在我的自定义选择中。调用setFilter()会导致无限调用循环