javad.t
سه شنبه 24 دی 1392, 15:11 عصر
این برنامه فقطی از تابع main فراخوانی میشه پنجره QTableView داده ها رو نشون میده اما موقعی که از یه کلاس دیگه فراخونی میشه هیچ داده ای رو نمیاره؟؟
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
EditableSqlModel editableModel;
QSqlQueryModel *nmodel(&editableModel);
nmodel->setQuery("SELECT * FROM test.tellbook;");
QTableView *view = new QTableView;
view->setModel(&editableModel);
view->show();
return a.exec();
}
..
..
..
EditableSqlModel::EditableSqlModel(QObject *parent)
: QSqlQueryModel(parent)
{
}
Qt::ItemFlags EditableSqlModel::flags(
const QModelIndex &index) const
{
Qt::ItemFlags flags = QSqlQueryModel::flags(index);
if (index.column() == 1 || index.column() == 2)
flags |= Qt::ItemIsEditable;
return flags;
}
bool EditableSqlModel::setData(const QModelIndex &index, const QVariant &value, int /* role */)
{
if (index.column() < 1 || index.column() > 2)
return false;
QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);
int id = data(primaryKeyIndex).toInt();
clear();
bool ok;
if (index.column() == 1) {
ok = setFirstName(id, value.toString());
} else {
ok = setLastName(id, value.toString());
}
refresh();
return ok;
}
void EditableSqlModel::refresh()
{
setQuery("SELECT * FROM test.tellbook;");
setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
setHeaderData(1, Qt::Horizontal, QObject::tr("First name"));
setHeaderData(2, Qt::Horizontal, QObject::tr("Last name"));
}
bool EditableSqlModel::setFirstName(int personId, const QString &firstName)
{
QSqlQuery query;
query.prepare("UPDATE `test`.`tellbook` SET `pName`=? WHERE `tellId`= ?");
query.addBindValue(firstName);
query.addBindValue(personId);
return query.exec();
}
bool EditableSqlModel::setLastName(int personId, const QString &lastName)
{
QSqlQuery query;
query.prepare("UPDATE `test`.`tellbook` SET `pFamily`=? WHERE `tellId`= ?");
query.addBindValue(lastName);
query.addBindValue(personId);
return query.exec();
}
اما حالا اگه همین فراخوانی از یک کلاس دیگه فراخانی بشه QTableView هیچی نمیاره؟مثلا:
dialogDataGrid::dialogDataGrid(QWidget *parent) :
QDialog(parent),
ui(new Ui::dialogDataGrid)
{
ui->setupUi(this);
EditableSqlModel editableModel;
QSqlQueryModel *nmodel(&editableModel);
nmodel->setQuery("SELECT * FROM test.tellbook;");
QTableView *view = new QTableView;
view->setModel(&editableModel);
view->show();
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
EditableSqlModel editableModel;
QSqlQueryModel *nmodel(&editableModel);
nmodel->setQuery("SELECT * FROM test.tellbook;");
QTableView *view = new QTableView;
view->setModel(&editableModel);
view->show();
return a.exec();
}
..
..
..
EditableSqlModel::EditableSqlModel(QObject *parent)
: QSqlQueryModel(parent)
{
}
Qt::ItemFlags EditableSqlModel::flags(
const QModelIndex &index) const
{
Qt::ItemFlags flags = QSqlQueryModel::flags(index);
if (index.column() == 1 || index.column() == 2)
flags |= Qt::ItemIsEditable;
return flags;
}
bool EditableSqlModel::setData(const QModelIndex &index, const QVariant &value, int /* role */)
{
if (index.column() < 1 || index.column() > 2)
return false;
QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);
int id = data(primaryKeyIndex).toInt();
clear();
bool ok;
if (index.column() == 1) {
ok = setFirstName(id, value.toString());
} else {
ok = setLastName(id, value.toString());
}
refresh();
return ok;
}
void EditableSqlModel::refresh()
{
setQuery("SELECT * FROM test.tellbook;");
setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
setHeaderData(1, Qt::Horizontal, QObject::tr("First name"));
setHeaderData(2, Qt::Horizontal, QObject::tr("Last name"));
}
bool EditableSqlModel::setFirstName(int personId, const QString &firstName)
{
QSqlQuery query;
query.prepare("UPDATE `test`.`tellbook` SET `pName`=? WHERE `tellId`= ?");
query.addBindValue(firstName);
query.addBindValue(personId);
return query.exec();
}
bool EditableSqlModel::setLastName(int personId, const QString &lastName)
{
QSqlQuery query;
query.prepare("UPDATE `test`.`tellbook` SET `pFamily`=? WHERE `tellId`= ?");
query.addBindValue(lastName);
query.addBindValue(personId);
return query.exec();
}
اما حالا اگه همین فراخوانی از یک کلاس دیگه فراخانی بشه QTableView هیچی نمیاره؟مثلا:
dialogDataGrid::dialogDataGrid(QWidget *parent) :
QDialog(parent),
ui(new Ui::dialogDataGrid)
{
ui->setupUi(this);
EditableSqlModel editableModel;
QSqlQueryModel *nmodel(&editableModel);
nmodel->setQuery("SELECT * FROM test.tellbook;");
QTableView *view = new QTableView;
view->setModel(&editableModel);
view->show();
}