内容简介:PyQt API可以和很多基于SQL的数据库进行通信,用的类是QSqlDatabase。具体使用哪个数据库要使用相应的驱动:先创建一个含有五个记录的数据库:
PyQt API可以和很多基于 SQL 的数据库进行通信,用的类是QSqlDatabase。
具体使用哪个数据库要使用相应的驱动:
- QDB2:IBM DB2
- QIBASE:Borland InterBase Driver
- QMYSQL:MySQL Driver
- QOCI:Oracle Call Interface Driver
- QODBC:ODBC Driver (includes Microsoft SQL Server)
- QPSQL:PostgreSQL Driver
- QSQLITE:SQLite version 3 or above
- QSQLITE2“SQLite version 2
db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
QSqlDatabase的函数
- setDatabaseName():设置数据库的名称
- setHostName():设置安装数据库的主机的名称
- setUserName():输入用户名
- setPassword():输入密码
- commit():提交事务,如果连接成功则返回true
- rollback():回滚事务
- close():关闭连接
举例
先创建一个含有五个记录的数据库:
from PyQt4 import QtSql, QtGui def createDB(): db = QtSql.QSqlDatabase.addDatabase('QSQLITE') db.setDatabaseName('sports.db') if not db.open(): QtGui.QMessageBox.critical(None, QtGui.qApp.tr("Cannot open database"), QtGui.qApp.tr("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() query.exec_("create table sportsmen(id int primary key, " "firstname varchar(20), lastname varchar(20))") query.exec_("insert into sportsmen values(101, 'Roger', 'Federer')") query.exec_("insert into sportsmen values(102, 'Christiano', 'Ronaldo')") query.exec_("insert into sportsmen values(103, 'Ussain', 'Bolt')") query.exec_("insert into sportsmen values(104, 'Sachin', 'Tendulkar')") query.exec_("insert into sportsmen values(105, 'Saina', 'Nehwal')") return True if __name__ == '__main__': import sys app = QtGui.QApplication(sys.argv) createDB()
再实际连接并操作这个数据库:
import sys from PyQt4 import QtCore, QtGui, QtSql def initializeModel(model): model.setTable('sportsmen') model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange) model.select() model.setHeaderData(0, QtCore.Qt.Horizontal, "ID") model.setHeaderData(1, QtCore.Qt.Horizontal, "First name") model.setHeaderData(2, QtCore.Qt.Horizontal, "Last name") def createView(title, model): view = QtGui.QTableView() view.setModel(model) view.setWindowTitle(title) return view def addrow(): print model.rowCount() ret = model.insertRows(model.rowCount(), 1) print ret def findrow(i): delrow = i.row() if __name__ == '__main__': app = QtGui.QApplication(sys.argv) db = QtSql.QSqlDatabase.addDatabase('QSQLITE') db.setDatabaseName('sports.db') model = QtSql.QSqlTableModel() delrow = -1 initializeModel(model) view1 = createView("Table Model (View 1)", model) view1.clicked.connect(findrow) dlg = QtGui.QDialog() layout = QtGui.QVBoxLayout() layout.addWidget(view1) button = QtGui.QPushButton("Add a row") button.clicked.connect(addrow) layout.addWidget(button) btn1 = QtGui.QPushButton("del a row") btn1.clicked.connect(lambda: model.removeRow(view1.currentIndex().row())) layout.addWidget(btn1) dlg.setLayout(layout) dlg.setWindowTitle("Database Demo") dlg.show() sys.exit(app.exec_())
绘图API QPaintDevice和QPainter
PyQt中的所有QWidget类都是QPaintDevice的子类。QPaintDevice是使用QPainter进行绘图的二维空间的抽象。绘图设备的维度是从左上角开始度量。
无论QPainter类的样式更新时,QPaintEvent都会发生。
QPainter的函数
- begin():开始绘图
- drawArc():绘制圆弧
- drawEllipse():绘制椭圆
- drawLine():绘制直线
- drawPixmap():从一个图片文件中提取pixmap,然后显示
- drwaPolygon():绘制多边形
- drawRect():绘制矩形
- drawText():显示文字
- fillRect():使用QColor参数填充矩形
- setBrush():设置画刷样式
- setPen():设置画笔的颜色、尺寸和样式
画刷样式
预定义的QColor样式
Qt.NoBrush | No brush pattern
Qt.SolidPattern | Uniform color
Qt.Dense1Pattern | Extremely dense brush pattern
Qt.HorPattern | Horizontal lines
Qt.VerPattern | Vertical lines
Qt.CrossPattern | Crossing horizontal and vertical lines
Qt.BDiagPattern | Backward diagonal lines
Qt.FDiagPattern | Forward diagonal lines
Qt.DiagCrossPattern | Crossing diagonal lines
预定义的QColor对象
Qt.white | Qt.black | Qt.red
Qt.darkRed | Qt.green | Qt.darkGreen
Qt.blue | Qt.cyan | Qt.magenta
Qt.yellow | Qt.darkYellow | Qt.gray
举例
import sys from PyQt4.QtGui import * from PyQt4.QtCore import * class Example(QWidget): def __init__(self): super(Example, self).__init__() self.initUI() def initUI(self): self.text = "hello world" self.setGeometry(100,100, 400,300) self.setWindowTitle('Draw Demo') self.show() def paintEvent(self, event): qp = QPainter() qp.begin(self) qp.setPen(QColor(Qt.red)) qp.setFont(QFont('Arial', 20)) qp.drawText(10,50, "hello Python") qp.setPen(QColor(Qt.blue)) qp.drawLine(10,100,100,100) qp.drawRect(10,150,150,100) qp.setPen(QColor(Qt.yellow)) qp.drawEllipse(100,50,100,50) qp.drawPixmap(220,10,QPixmap("python.jpg")) qp.fillRect(200,175,150,100,QBrush(Qt.SolidPattern)) qp.end() def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()
剪贴板QClipboard
QClipboard提供了对系统剪贴板的访问,可以很简单地在不同应用之间复制和粘贴数据。它的动作跟QDrag类类似,使用类似的数据结构。
QApplication类有一个静态函数clipboard()来访问系统剪贴板。
QClipboard的函数
- clear():清空剪贴板内容
- setImage():复制QImage到剪贴板
- setMimeData():复制MIME数据到剪贴板
- setPixmap():复制Pixmap对象到剪贴板
- setText():复制QString到剪贴板
- text():从剪贴板中取得文本
QClipboard的信号
dataChanged():剪贴板数据变化
QPixmap
QPixmap和QImage都是图片类,前者专门用于绘图,用作QPaintDevice对象,或者加载到其他控件中,通常是标签或按钮,以及在屏幕上显示;而QImage则是为I/O进行了优化。
可以读取到QPixmap中的图片格式有:
BMP、GIF、JPG、JPEG、PNG、PBM、PGM、PPM、XBM、XPM。
QPixmap的函数
- copy():从一个QRect对象中复制pixmap数据
- fromImage():将QImage对象转换成QPixmap
- grabWidget():从给定的控件中创建pixmap
- grabWindow():在窗口中创建pixmap数据
- Load():加载一个图片作为pixmap
- save():保存一个QPixmap对象为一个文件
- toImage():将一个QPixmap转换成QImage
举例
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * def window(): app = QApplication(sys.argv) win = QWidget() l1 = QLabel() l1.setPixmap(QPixmap("python.jpg")) vbox = QVBoxLayout() vbox.addWidget(l1) win.setLayout(vbox) win.setWindowTitle("QPixmap Demo") win.show() sys.exit(app.exec_()) if __name__ == '__main__': window()
以上所述就是小编给大家介绍的《PyQt4教程系列四:高阶功能》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
How to Build a Billion Dollar App
George Berkowski / Little, Brown Book Group / 2015-4-1 / USD 24.95
Apps have changed the way we communicate, shop, play, interact and travel and their phenomenal popularity has presented possibly the biggest business opportunity in history. In How to Build a Billi......一起来看看 《How to Build a Billion Dollar App》 这本书的介绍吧!