با درود . برای این بخش از آموزش تصمیم گرفتم تا اصول کار با پایگاه داده و همچنین جدول های پایگاه داده رو آمورش بدم. خب قبل از همه همه چیز باید اول جدذول های مورد نیاز پایگاه دادمون را مشخص کنیم بعد از طراحی پایگاه داده شروع به ساخت تک تک بخش های برنامه می کنیم و در اخر تمام قطعات ساخته شده رو سرهم می کنیم تا برنامه یکپارچه بشه. خب جدول های پایگاه داده ی ما حاوی اطلاعات زیر هستن:
جدول 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 ذخیر کنین و اجرا کنین ونتیجه رو مشاهده کنین :).