PDA

View Full Version : سوال: چرا این کد فقط تو تابع main کار میکنه؟



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();

}

alamate_aoal
پنج شنبه 03 بهمن 1392, 21:43 عصر
حافظه ی شی تعریف شده در خط هشتم از سازنده dialogDataGrid رو از Heap بگیر. احتمالا با اینکار مشکل باید برطرف بشه.

javad.t
جمعه 04 بهمن 1392, 19:09 عصر
ممنون جوابم قبلا در این سایت گرفتم:
http://qa.qtips.ir/1125/از-دوستان-کیوتی-کار-یکی-میگه-مشکل-من-چیه؟-اصلاح-لینک-دانلود