QSqlTableModel – پروژه برنامه نویسی Qt کار با دیتابیس sqlite - وب سایت رضا احمدی

آموزش کار با ویدجت ها و Qsqltablemodel

QSqlTableModel – پروژه برنامه نویسی Qt کار با دیتابیس sqlite

در این مقاله قصد داریم ببینیم چطور میشه به سلولهای مختلف در جدول های مختلف یک دیتابیس دسترسی پیدا کرد وآن ها را درون فرم ها و ویجتها بنویسیم…(ابتدا مقاله آموزش کار با sqlite  در qt را بخوانید)

کلاس های مورد نیاز این آموزش

در این پروژه کار با کلاس های QSqlTableModel و QSqlQuery و رویدادهای کلاس QSpinBox و افزود و اجرای یک فرم جدید آشنا خواهید شد.

طراحی رابط کاربری

پروژه ای که در قسمت های قبلی ساختیم را باز کنید و یک فرم جدید به برنامه اضافه کنید برای این کار کافی است مانند زیر عمل کنید:

برروی نام پروژه راست کلیک کرده و گزینه add new را انتخاب کنید. سپس در پنجره باز شده از تمپلیت Qt گزینه Qt Designer form Class را انتخاب کنید سپس مانند تصویر زیر گزینه widget را انتخاب کنید و یک نام به این فرم جدید بدهید.

افزودن یک ویدجت جدید به برنامه

در فرم جدید ساحته اشیا زیر را وارد کنید مانند تصویر زیر:

طراحی فرم

هدف این فرم:

هر گاه کاربر عدد درون spinBox را تغییر داد با توجه به شماره ID وارده مشخصات کاربر مورد نظر در فرم نمایش داده شود…

پیاده سازی متدها

تا اینجا ما یک فرم جدید به پروژه اضافه کردیم ولی هنور هیچ ابجکتی از این فرم جدید که userInfoForm نام دارد را نساخته ایم . برای این کار درون فرم اصلی نرم افزار یک کلید جدید میتوانیم ایجاد کنیم که با کلیک بر روی آن این فرم اجرا و نمایش داده شود. برای این منظور یک عضو جدید به کلاس zxMain اضافه میکنیم نام این عضو جدید userForm و نوع آن از کلاس userInfoForm است .سپس یک اسلات جدید برای کلیدی که قرار است آن فرم را اجرا کند در نظز میگیرم نام این اسلات btn_userInfoShow() است. و برای اجرای ویدجدت مورد نظز کافی است مانند زیر عمل کنیم:

  1. void zxMain::btn_userInfoShow()
  2. {
  3.     userForm.show();
  4. }

نکته از طریق متد connect این اسلات را به کلید مورد نظر وصل کنید.و حال سراغ برنامه نویسی متد های درون فرم می رویم.

ابتدا باید بدانیم در شی QSpinBox یک سیگنال به نام valueChanged(int) وجود دارد که هر گاه مقدار دون اسپین باکس تغییر کند یک سیگنال به برنامه می فرستد که حاوی مقدار جدید از نوع int می باشد.پس در کانستراکتور کلاس userInfoForm این سیگنال را به اسلاتی که قرار است با دریافت یک عدد صحیح مشخصات را نمایش دهد وصل می کنیم:

  1. connect(ui->spinBox,SIGNAL(valueChanged(int)),this,SLOT(getIdInfo(int)));

من نام این اسلات را getIdInfo(int) گذاشتم .

و اما پیاده سازی این متد(اسلات):

در این متد ما یک شی از کلاس QSqlTabelModel می سازیم در این شی جدول مورد نظر را تنظیم میکنیم سپس با اعمال فیلتر لازم محتویات جدول را میخواینم.

  1. void userInfoForm::getIdInfo(int id)
  2. {
  3.     QSqlTableModel tb;
  4.     tb.setTable("Users");
  5.     tb.setFilter("id="+QString::number(id));
  6.     tb.select();
  7.     ui->lb_FName->setText(tb.record(0).value("fname").toString());
  8.     ui->lb_LName->setText(tb.record(0).value("lname").toString());
  9.     ui->lb_phone->setText(tb.record(0).value("phone").toString());
  10.     ui->lb_age->setText(tb.record(0).value("age").toString());
  11.     ui->lb_Address->setText(tb.record(0).value("address").toString());
  12. }

همانطور که در بالا مشخص است در متد setFilter از کلاس QSqlTabelModel مایک سری شرط برای این جدول جدید در نظر گرفتیم اگر این متد را استفاده نکیم شی ساخته شده شامل کل جدول کاربران خواهد بودسپس با استفاده از متد select جدول را فراخوانی میکنیم.

برای بدست آورن یک سلول خاص از دستور record ردیف مورد نظر را انتخاب و با متد value(collname) نام ستون مورد نظر را داده و مقداری که درون این سلول است برگشت داده میشود حال این مقدار برگشتی را به رشته تبدیل میکنیم و در لیبل مورد نظر تنظیم میکنیم.

نتیجه برنامه :

آموزش کار با ویدجت ها و Qsqltablemodel

نکته: در sqlite برای ایجاد شرط از دستور where استفاده می شوداین متد همان کار را برای ما انجام میدهد.

برای مثال در sqlite برای بدست اوردن مشخصات کاربری از جدول Users با شماره  id=3داریم:

  1.   SELECT * FROM Users WHERE id=3;

سورس مربوط به این قسمت:

userInfoForm.h

  1. #ifndef USERINFOFORM_H
  2. #define USERINFOFORM_H
  3.  
  4. #include <QWidget>
  5.  
  6. namespace Ui {
  7. class userInfoForm;
  8. }
  9.  
  10. class userInfoForm : public QWidget
  11. {
  12.     Q_OBJECT
  13.  
  14. public:
  15.     explicit userInfoForm(QWidget *parent = 0);
  16.     ~userInfoForm();
  17.  
  18. private:
  19.     Ui::userInfoForm *ui;
  20. private slots:
  21.     void getIdInfo(int id);
  22. };
  23.  
  24. #endif // USERINFOFORM_H

userInfoForm.cpp

  1. #include "userinfoform.h"
  2. #include "ui_userinfoform.h"
  3. #include <QtSql>
  4. userInfoForm::userInfoForm(QWidget *parent) :
  5.     QWidget(parent),
  6.     ui(new Ui::userInfoForm)
  7. {
  8.     ui->setupUi(this);
  9.     connect(ui->spinBox,SIGNAL(valueChanged(int)),this,SLOT(getIdInfo(int)));
  10. }
  11.  
  12. userInfoForm::~userInfoForm()
  13. {
  14.     delete ui;
  15. }
  16.  
  17. void userInfoForm::getIdInfo(int id)
  18. {
  19.     QSqlTableModel tb;
  20.     tb.setTable("Users");
  21.     tb.setFilter("id="+QString::number(id));
  22.     tb.select();
  23.     ui->lb_FName->setText(tb.record(0).value("fname").toString());
  24.     ui->lb_LName->setText(tb.record(0).value("lname").toString());
  25.     ui->lb_phone->setText(tb.record(0).value("phone").toString());
  26.     ui->lb_age->setText(tb.record(0).value("age").toString());
  27.     ui->lb_Address->setText(tb.record(0).value("address").toString());
  28. }

دیگر مطالب این وب سایت را نیز بخوانید و با دوستان خود اشتراک بگذارید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دیدگاه های ثبت شده

تا کنون دیدگاهی ثبت نشده است.