خانه برنامه نویسی QSqlTableModel – پروژه برنامه نویسی Qt کار با دیتابیس sqlite
آموزش کار با ویدجت ها و Qsqltablemodel

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


۱۷ دی ۱۳۹۸
رضا احمدی
293 بازدید
دسته بندی : c++ , Qt creator , برنامه نویسی

در این مقاله قصد داریم ببینیم چطور میشه به سلولهای مختلف در جدول های مختلف یک دیتابیس دسترسی پیدا کرد وآن ها را درون فرم ها و ویجتها بنویسیم…(ابتدا مقاله آموزش کار با 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. }

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

مطالب مرتبط

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

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

0 دیدگاه ارائه شده برای "QSqlTableModel – پروژه برنامه نویسی Qt کار با دیتابیس sqlite"

  1. Avatar محمد گفت:

    دمت گرم واقعا مفید و کامل بود
    اجرتون با الله تعالی

  2. Avatar siavash گفت:

    آقا دمت گرم چرا ادامه نمیدی؟

    1. رضا احمدی رضا احمدی گفت:

      قربونت.ادامه داره ولی فعلا وقت نوشتن ندارم….

  3. Avatar احمدرضا گفت:

    سلام وقتتون بخیر من دانشجو هستم
    برای امتحان پایان ترم گفتن که ۲ تا پروژه باعنوان file editorو chatبا کیوت ارائه بدیم ممنون میشم راهنمایی کنین

    1. رضا احمدی رضا احمدی گفت:

      سلام
      صفحه زیر میتونه راهنمای خوبی برای شما باشه.
      WIP-How to create a simple chat application

      موفق باشید.

  4. Avatar کسری بخشایی گفت:

    سفارش پروژه – برنامه نویسی
    نام و نام خانوادگی : کسری بخشایی
    تلفن : ۰۹۳۹۷۹۴۱۵۸۸
    ایمیل :ksrbakhshaei1376@gmail.com


    plants and zombie

    هزینه پیشنهادی: ۲۰۰۰۰۰ تومان – زمان پیشنهادی ۱ هفته
    file:https://mrzx.ir/wp-content/uploads/2020/08/project.pdf

  5. Avatar جمشیدیان گفت:

    سلام. میشه لطفا فایل شبیه سازی با ادوات الکترونیکی (فایل پروتئوس یا التیوم) این پروژه را برام بفرستید؟ خواهش میکنم، احتیاج دارم

    1. رضا احمدی رضا احمدی گفت:

      با سلام
      شماتیک مدار بصورت کامل توضیح داده شده . اونو توی پروتئوس رسم کنیدو و اجرا کنید .

  6. Avatar ALI REZAIE گفت:

    سفارش پروژه – برنامه نویسی
    نام و نام خانوادگی : ALI REZAIE
    تلفن : ۰۹۳۵۹۳۰۸۰۸۳
    ایمیل :alirfabad@gmail.com


    Qt login by google acount
    سلام و عرض ادب… یک لاگین میخام به gui اضافه کنم… البته با استفاده از گوگل اکانت… داخل نرم افار از یک api گوگل استفاده کردم قلش هر کاربر باید لاگین کنه… بعد اینکه لاگین کرد یا عکسش یا اسمش داخل تولبار نشون داده بشه…
    هزینه پیشنهادی: تومان – زمان پیشنهادی ۱ هفته
    file:

  7. Avatar الی گفت:

    عالی بود ممنون

  8. Avatar الی گفت:

    سلام من میخوام این پروژه رو بسازم اما نمی تونم بفهمم بعضی قطعات مثل J7 کارش چی هست؟ و اصلا چه قطعه ای باید بخرم. ممنون میشم راهنماییم کنید

    1. رضا احمدی رضا احمدی گفت:

      سلام
      قطعه j7 یک کانکتور پین هدر نری است که به پورت B میکرو وصل شده. این قطعه در این پروژه کاربردی ندارد و فقط برای استفاده های ممکن در آینده بر روی برد قرار گرفته تا اگر نیاز به تغییر جزیی در پروژه بود برنامه میکرو را تغییر داده و از این پورت استفاده شود.
      پین هدر 40*1 صاف نری

  9. Avatar الی گفت:

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