منبع اصلی نوشتار زیر در این لینک قرار دارد

آموزش پای کیوت ( اغاز کار با پایگاه داده)

با درود . برای این بخش از آموزش تصمیم گرفتم تا اصول کار با پایگاه داده و همچنین جدول های پایگاه داده رو  آمورش بدم. خب قبل از همه همه چیز باید اول جدذول های مورد نیاز پایگاه دادمون را مشخص کنیم بعد از طراحی پایگاه داده شروع به ساخت تک تک بخش های برنامه می کنیم و در اخر تمام قطعات ساخته شده رو سرهم می کنیم تا برنامه یکپارچه بشه. خب جدول های پایگاه داده ی ما حاوی اطلاعات زیر هستن:

جدول stuff که شامل id ,name, price,tip

جدول buyer که شامل id, name,tel,address,descript

جدول orders که شاملid,stuffid,stuff,number,price,date,factornumber,buyer_code

جدول orderNow که شامل stuffId ,stuff,number,pricestuff,totalstuff

 

جدول stuff شامل ای دی کالا ، نام و قیمت و توضیحی درباره ان است.

جدول buyer که مشخصات خریدار از قبیل نام و ادرس و تلفن رو نگه داری می کند

جدول orders که کالای خریداری شده رو با ذکر تعداد اون کالا و قیمتشون و تاریخ خرید و شماره ای دی خریدار اون و همچنین شماره فاکتوری که کالا در اون قرار دارد را نگه داری می کند

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

حالا بسراغ اولین بخش از ایجاد برنامه می ریم که همون ایجاد پایگاه داده هستش. کد زیر جدولی با نام db.sqlite در پایگاه داده ای از نوع sqlite ایجاد می کند و تمامی جدول های توضیح داده شده در بالا را یک به یک می سازد. سورس زیر را در فایلی بنام sql.py ذخیره می کنیم .

from PyQt4 import QtSql, QtGui , QtCore

def createConnection():
    db =QtSql.QSqlDatabase.addDatabase('QSQLITE')
    db.setDatabaseName('db.sqlite')
    if not db.open():
        QtGui.QMessageBox.critical(None,'Cannot open database',
                "Unable to establish a database connection.\n"
                              "This example needs SQLite support. Please read "
                              "the Qt SQL driver documentation for information "
                              "how to build it.\n\n"
                              "Click Cancel to exit.",
                QtGui.QMessageBox.Cancel)
        return False
    query = QtSql.QSqlQuery()
    QtGui.QApplication.processEvents()
    query.exec_('''CREATE TABLE  company(
id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,
name TEXT NOT NULL ,
address TEXTNOT NULL,
tel TEXT,
descript TEXT)''')
    query.exec_('''CREATE TABLE  users(
id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,
username TEXT UNIQUE ,
pass TEXT,
email TEXT,
sq TEXT,
answer TEXT
)''')
    query.exec_('''
CREATE TABLE  stuff(
id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,
name NVARCHAR(100) NOT NULL,
price INTEGER ,
tip TEXT)''')

    query.exec_('''CREATE TABLE  buyer(
id INTEGER PRIMARY KEY AUTOINCREMENT ,
name VARCHAR,
tel VARCHAR,
address TEXT,
descript TEXT)''')

    query.exec_('''CREATE TABLE  orders(
id INTEGER PRIMARY KEY AUTOINCREMENT ,
STUFFID INTEGER,
stuff INTEGER,
number INTEGER,
price INTEGER,
date DATE,
factorNumber INTEGER  NOT NULL,
buyer_code INTEGER,
FOREIGN KEY (buyer_code) REFERENCES buyer(id) )''')

    query.exec_('''CREATE TABLE  orderNow(
STUFFID INTEGER,
stuff INTEGER,
number INTEGER,
priceStuff INTEGER,
totalPrice INTEGER)''')
    return True

حالا نوبت به طراحی اولین بخش از برنامه می رسه. چون از اینجا به بعد باید با جدولها کار کنیم نیاز هستش که من اصول نمایش و کارجدول هارو قبل از شروع شرح بدم. برای نمایش یک جدول از پایگاه داده که اینجا جدول stuff یا کالا رو مثال می زنم باید ابتدا یک model   از این جدول بسازیم و پس از اون  این مدل رو در  یک ویدجت نمایش مثل Table View   یا Tree view قرار بدیم تا اطلاعات نمایش داده بشن. برای حذف یا اضافه کردن اطلاعات به جدول باید تغیرات رو بروی model اعمال کنیم


من دیگه لای اوت گذاری برنامه رو توضیح نمی دم فرض می کنم که باش اشنا هستین ( برای اشنایی با لای اوت های مختلف مثال های همراه پای کیوت بسیار عالی هستن) . ابتدا باید ماژول sql.py که در بالا توضیح داده شد  در اغاز پروژه بصورت import sql  وارد کنیم:

import sys
from PyQt4 import QtGui ,QtCore,QtSql
from PyQt4.QtCore import Qt
import sql

در اخر پروژه نیز تابع createConnection  از ماژول sql  رو برای ساخت پایگاه داده فرا خوانی کنیم با این کار قبل از احجرا شدن اپلیکشن اتصال با پایگاه داده بر قرار می شه:

 if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv);
    if not sql.createConnection():
        sys.exit(1)
    box = storeWindow()
    box.move(30,30);
    box.resize(500,500)
    box.show()
    app.exec_()

پس از اتصال به پایگاه داده نوبت ایجاد مدل و معرفی کردن جدول پایگاه داده مورد نظر به  اون می باشد . در اینجا جدول کالاها یا همون stuff  برای حذف و اضافه کردن کالاها به اون مد نظر است:

        self.model = QtSql.QSqlTableModel()
        self.model.setTable('stuff')
        self.model.setEditStrategy(
            QtSql.QSqlTableModel.OnManualSubmit)
        self.model.select()

        self.model.setHeaderData(0, QtCore.Qt.Horizontal, "Code")
        self.model.setHeaderData(1, QtCore.Qt.Horizontal, "Stuff")
        self.model.setHeaderData(2, QtCore.Qt.Horizontal, "Price")
        self.model.setHeaderData(3, QtCore.Qt.Horizontal, "Tip")

بعد از ایجاد مدل برای نمایش اون باید مدل رو دریک table view  یا treeView قرار بدیم:

        self.view = QtGui.QTableView()
        self.view.setModel(self.model)
        self.view.setSelectionBehavior(
            QtGui.QAbstractItemView.SelectRows)

بعد از این کار تمامی اطلاعات درون جدول کالاها  باید نمایش داده شود. سپس نوبت به ساختن توابع اضافه کردن و حذف از جدول می رسه که بصورت زیر ساخته می شن:

 
    def setData(self):
        query = QtSql.QSqlQuery()

        stuff = self.stuffNameEDit.text()
        price = self.priceEdit.text()
        tip = self.desEdit.text()

        query.exec_(
            'INSERT INTO stuff(name,price,tip) VALUES ("%s",%s,"%s")'%
            (stuff,price,tip))
        self.model.submitAll()

    def deleteData(self):

        selected =self.view.selectionModel().selectedIndexes()
        if QtGui.QMessageBox.question(self, "Stuff Data",
                QtCore.QString("Do you want delete this row"),
                QtGui.QMessageBox.Yes|QtGui.QMessageBox.No) == QtGui.QMessageBox.No:
            return
        for i in range (0,len(selected)):
            self.model.removeRows(selected[i].row(), 1)
        self.model.submitAll()

خب کار تمام شد کد کامل بخش دوم برنامه ما بصورت زیر هستش:

import sys
from PyQt4 import QtGui ,QtCore,QtSql
from PyQt4.QtCore import Qt
import sql

class storeWindow(QtGui.QWidget):
    def __init__(self,parent=None):
        super(storeWindow, self).__init__(parent)

        stuffNameLabel = QtGui.QLabel('Stuff name')
        self.stuffNameEDit = QtGui.QLineEdit()

        priceLabel = QtGui.QLabel('Price')
        self.priceEdit = QtGui.QLineEdit()

        desLabel = QtGui.QLabel('Tip')
        self.desEdit = QtGui.QLineEdit()        
        texttLabel = QtGui.QLabel(
            'Enter stuff information to add your stuff in store:')

        formLayout = QtGui.QFormLayout()
        formLayout.addRow(texttLabel)
        formLayout.addRow(stuffNameLabel,self.stuffNameEDit)
        formLayout.addRow(priceLabel,self.priceEdit)
        formLayout.addRow(desLabel,self.desEdit)

        DeleteB = QtGui.QPushButton('Delete stuff')
        DeleteB.setFixedWidth(90)

        self.model = QtSql.QSqlTableModel()
        self.model.setTable('stuff')
        self.model.setEditStrategy(
            QtSql.QSqlTableModel.OnManualSubmit)
        self.model.select()

        self.model.setHeaderData(0, QtCore.Qt.Horizontal, "Code")
        self.model.setHeaderData(1, QtCore.Qt.Horizontal, "Stuff")
        self.model.setHeaderData(2, QtCore.Qt.Horizontal, "Price")
        self.model.setHeaderData(3, QtCore.Qt.Horizontal, "Tip")

        self.view = QtGui.QTableView()
        self.view.setModel(self.model)
        self.view.setSelectionBehavior(
            QtGui.QAbstractItemView.SelectRows)

        groupBox = QtGui.QGroupBox('Add stuff')

        viewLayout = QtGui.QVBoxLayout()
        viewLayout.addWidget(self.view)
        viewLayout.addWidget(DeleteB)

        AddB = QtGui.QPushButton('Add stuff')
        AddB.setFixedWidth(80)

        AddB.clicked.connect(self.setData)
        DeleteB.clicked.connect(self.deleteData)

        closeB = QtGui.QPushButton('Close')
        closeB.setFixedWidth(55)

        closeB.clicked.connect(self.close)

        buttonBox = QtGui.QDialogButtonBox()
        buttonBox.addButton(AddB, QtGui.QDialogButtonBox.ActionRole)
        buttonBox.addButton(closeB, QtGui.QDialogButtonBox.RejectRole)

        groupBox.setLayout(formLayout)
        self.mainVlayout = QtGui.QVBoxLayout()
        self.mainVlayout.addLayout(viewLayout)
        self.mainVlayout.addWidget(groupBox)
        self.mainVlayout.addWidget(buttonBox)

        self.setLayout(self.mainVlayout)

    def setData(self):
        query = QtSql.QSqlQuery()

        stuff = self.stuffNameEDit.text()
        price = self.priceEdit.text()
        tip = self.desEdit.text()

        query.exec_(
            'INSERT INTO stuff(name,price,tip) VALUES ("%s",%s,"%s")'%
            (stuff,price,tip))
        self.model.submitAll()

    def deleteData(self):

        selected =self.view.selectionModel().selectedIndexes()
        if QtGui.QMessageBox.question(self, "Stuff Data",
                QtCore.QString("Do you want delete this row"),
                QtGui.QMessageBox.Yes|QtGui.QMessageBox.No) == QtGui.QMessageBox.No:
            return
        for i in range (0,len(selected)):
            self.model.removeRows(selected[i].row(), 1)
        self.model.submitAll()

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv);
    if not sql.createConnection():
        sys.exit(1)
    box = storeWindow()
    box.move(30,30);
    box.resize(500,500)
    box.show()
    app.exec_()

این کد رو در فایلی بنام store.py در کنار sql.py ذخیر کنین و اجرا کنین ونتیجه رو مشاهده کنین :).



برچسب ها : , , , ,