内容简介: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教程系列四:高阶功能》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。