- 论坛徽章:
- 0
|
Qt和python都能够进行数据库操作,PyQt与MySQL等数据库通信的关键是signals and slots处理。将Qt视图对象作为信号发送者,python对象作为信号接受者(槽),然后实现该python对象方法即可,类似Javascript中的事件绑定机制。实现Qt与python的“事件绑定”,要用connect方法。
关于Qt中connect方法的定义:
bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * member ) const
bool QObject::connect ( const QObject * sender, const char * signal, const char * member ) const
关于PyQt中的connect定义:
bool connect (QObject, SIGNAL(), QObject, SLOT(), Qt.ConnectionType = Qt.AutoConnection)
bool connect (QObject, SIGNAL(), callable, Qt.ConnectionType = Qt.AutoConnection)
这是我写的一个简单例子,读取、添加、删除书籍列表。使用MV思想,实现BookModel (python对象)与BookView (qt对象),BookModel负责数据模型操作,BookView负责视图的更新与“事件绑定”。为了方便起见使用sqlite3进行测试,要用mysql请自行修改。数据保存操作暂未实现,有兴趣的话可以自己去实现。
- # -*- coding: utf-8 -*-
- import sys
- import re
- #import MySQLdb
- import sqlite3
- from PyQt4.Qt import *
- '''
- DB_HOST = 'localhost'
- DB_USER = 'root'
- DB_PASSWORD = 'manager'
- DB_NAME = 'test'
- '''
- class Model():
- def execute(self, query, params=''):
- #conn = MySQLdb.connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)
- conn = sqlite3.connect('book.db')
- cur = conn.cursor()
- if params != '':
- cur.execute(query, params)
- else:
- cur.execute(query)
- if re.search(r'^SELECT', query, re.I):
- result = cur.fetchall()
- else:
- if cur.rowcount > 0:
- result = True
- else:
- result = False
- cur.close()
- conn.close()
- return result
- class BookModel(Model):
- def getList(self):
- return self.execute('SELECT title, author, published FROM book')
- def delete(self, id):
- return self.execute('DELETE FROM book WHERE id=%d' % id)
- def save(self, book):
- if book.has_key('id'):
- id = book.pop('id')
- return self.execute('UPDATE book SET %s=? WHERE id=%d' % ('=?, '.join(book.keys()), id), book.values())
- else:
- return self.execute('INSERT INTO book(title, author, published) values(?, ?, ?)', book.values())
- class BookView(QMainWindow):
- def __init__(self, parent=None):
- QMainWindow.__init__(self, parent)
- self.setWindowIcon(QIcon('qt.png'))
- self.setWindowTitle(u'书籍列表')
- self.setFixedSize(600, 400)
- self.center()
-
- action1 = QAction(u'添加', self)
- action2 = QAction(u'保存', self)
- action3 = QAction(u'删除', self)
- action4 = QAction(u'退出', self)
- action1.setShortcut('Ctrl+N')
- action2.setShortcut('Ctrl+S')
- action3.setShortcut('Ctrl+D')
- action4.setShortcut('Ctrl+Q')
- self.connect(action1, SIGNAL('triggered()'), self.action1Clicked)
- self.connect(action2, SIGNAL('triggered()'), self.action2Clicked)
- self.connect(action3, SIGNAL('triggered()'), self.action3Clicked)
- self.connect(action4, SIGNAL('triggered()'), SLOT('close()'))
- menubar = self.menuBar()
- menu1 = menubar.addMenu(u'编辑')
- menu1.addAction(action1)
- menu1.addAction(action2)
- menu1.addAction(action3)
- menu1.addSeparator()
- menu1.addAction(action4)
- self.statusBar().showMessage(u'双击项目进行编辑')
- table = QTableWidget()
- self.setCentralWidget(table)
- table.setColumnCount(4)
- table.setHorizontalHeaderItem(0, QTableWidgetItem(u'序号'))
- table.setHorizontalHeaderItem(1, QTableWidgetItem(u'书名'))
- table.setHorizontalHeaderItem(2, QTableWidgetItem(u'作者'))
- table.setHorizontalHeaderItem(3, QTableWidgetItem(u'年份'))
- table.setColumnWidth(0, 40)
- table.setColumnWidth(1, 350)
- table.setColumnWidth(2, 150)
- table.setColumnWidth(3, 50)
- table.verticalHeader().setVisible(False)
- def center(self):
- screen = QDesktopWidget().screenGeometry()
- size = self.geometry()
- self.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2)
- def action1Clicked(self):
- table = self.centralWidget()
- table.insertRow(table.rowCount())
- def action2Clicked(self):
- messageBox = QMessageBox(self)
- messageBox.setWindowTitle(u'对不起')
- messageBox.setText(u'该功能暂未实现!')
- messageBox.show()
- def action3Clicked(self):
- table = self.centralWidget()
- row = table.removeRow(table.currentRow())
- def addItems(self, items):
- table = self.centralWidget()
- table.setRowCount(len(items))
- i = 0
- for item in items:
- table.setItem(i, 0, QTableWidgetItem(unicode(i + 1)))
- table.setItem(i, 1, QTableWidgetItem(item[0]))
- table.setItem(i, 2, QTableWidgetItem(item[1]))
- table.setItem(i, 3, QTableWidgetItem(unicode(item[2])))
- i += 1
- def main():
- app = QApplication(sys.argv)
- model = BookModel()
- view = BookView()
- view.addItems(model.getList())
- view.show()
- sys.exit(app.exec_())
- if __name__ == '__main__':
- main()
复制代码
附代码:
book.7z
(3.54 KB, 下载次数: 86)
|
|