PyQt - 快速指南
PyQt - Introduction
PyQt是一个GUI小部件工具包。 它是Qt的Python接口, Qt是最强大,最受欢迎的跨平台GUI库之一。 PyQt由RiverBank Computing Ltd.开发。最新版本的PyQt可从其官方网站下载 - riverbankcomputing.com
PyQt API是一组包含大量类和函数的模块。 虽然QtCore模块包含用于处理文件和目录等的非GUI功能,但QtGui模块包含所有图形控件。 此外,还有用于处理XML (QtXml) ,SVG (QtSvg)和SQL (QtSql)等的模块。
支持环境
PyQt与所有流行的操作系统兼容,包括Windows,Linux和Mac OS。 它是双重许可的,可以通过GPL和商业许可获得。
Windows
您可以从上面对应于Python版本(2.7或3.4)和硬件架构(32位或64位)的下载链接下载并安装适当的安装程序。 请注意,有两个版本的PyQt可用,即PyQt 4.8和PyQt 5.5 。
虽然PyQt4可用于Python 2以及Python 3,但PyQt5只能与Python 3. *一起使用。
PyQt4 Windows Binaries
PyQt4-4.11.4-gpl-Py3.4-Qt4.8.7-x64.exe | Windows 64位安装程序 |
PyQt4-4.11.4-gpl-Py3.4-Qt4.8.7-x32.exe | Windows 32位安装程序 |
PyQt4-4.11.4-gpl-Py3.4-Qt5.5.0-x64.exe | Windows 64位安装程序 |
PyQt4-4.11.4-gpl-Py3.4-Qt5.5.0-x32.exe | Windows 32位安装程序 |
PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x64.exe | Windows 64位安装程序 |
PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x32.exe | Windows 32位安装程序 |
PyQt5 Windows Binaries
PyQt5-5.5-gpl-Py3.4-Qt5.5.0-x64.exe | Windows 64位安装程序 |
PyQt5-5.5-gpl-Py3.4-Qt5.5.0-x32.exe | Windows 32位安装程序 |
Linux
对于Ubuntu或任何其他debian Linux发行版,请使用以下命令安装PyQt -
sudo apt-get install python-qt4
<b class="notranslate">or </b>
sudo apt-get install pyqt5-dev-tools
您还可以使用“下载”页面上提供的源代码进行构建。
PyQt-x11-gpl-4.11.4.tar.gz | Linux,PyQt4的UNIX源代码 |
PyQt-gpl-5.5.tar.gz | PyQt5的Linux,UNIX,MacOS/X源代码 |
Mac OS
PyQtX项目( http://sourceforge.net/projects/pyqtx/ )托管PyQt for Mac的二进制文件。 按照以下命令使用Homebrew安装程序 -
brew install pyqt
PyQt - Hello World
使用PyQt创建一个简单的GUI应用程序涉及以下步骤 -
导入QtGui模块。
创建应用程序对象。
QWidget对象创建顶级窗口。 在其中添加QLabel对象。
将标签的标题设置为“hello world”。
通过setGeometry()方法定义窗口的大小和位置。
通过app.exec_ app.exec_()方法输入应用程序的主循环。
import sys
from PyQt4 import QtGui
def window():
app = QtGui.QApplication(sys.argv)
w = QtGui.QWidget()
b = QtGui.QLabel(w)
b.setText("Hello World!")
w.setGeometry(100,100,200,50)
b.move(50,20)
w.setWindowTitle(“PyQt”)
w.show()
sys.exit(app.exec_())
if __name__ == '__main__':
window()
上面的代码产生以下输出 -
PyQt - Major Classes
PyQt API是一个很大的类和方法集合。 这些类定义在20多个模块中。 以下是一些常用的模块 -
Sr.No. | 模块和描述 |
---|---|
1 | QtCore 其他模块使用的核心非GUI类 |
2 | QtGui 图形用户界面组件 |
3 | QtMultimedia 用于低级多媒体编程的类 |
4 | QtNetwork 网络编程的类 |
5 | QtOpenGL OpenGL支持类 |
6 | QtScript 用于评估Qt脚本的类 |
7 | QtSql 使用SQL进行数据库集成的类 |
8 | QtSvg 用于显示SVG文件内容的类 |
9 | QtWebKit 用于呈现和编辑HTML的类 |
10 | QtXml 用于处理XML的类 |
11 | QtAssistant 支持在线帮助 |
12 | QtDesigner 用于扩展Qt Designer的类 |
PyQt API包含400多个类。 QObject类位于类层次结构的顶部。 它是所有Qt对象的基类。 此外, QPaintDevice类是可以绘制的所有对象的基类。
QApplication类管理GUI应用程序的主要设置和控制流程。 它包含主事件循环,在其中处理和分派由窗口元素和其他源生成的事件。 它还可以处理系统范围和应用程序范围的设置。
从QObject和QPaintDevice类派生的QWidget类是所有用户界面对象的基类。 QDialog和QFrame类也派生自QWidget类。 他们有自己的子类系统。
下图描绘了其层次结构中的一些重要类。
以下是常用小部件的选择列表 -
Sr.No. | 小部件和描述 |
---|---|
1 | QLabel 用于显示文本或图像 |
2 | QLineEdit 允许用户输入一行文本 |
3 | QTextEdit 允许用户输入多行文字 |
4 | QPushButton 用于调用操作的命令按钮 |
5 | QRadioButton 允许从多个选项中选择一个 |
6 | QCheckBox 允许选择多个选项 |
7 | QSpinBox 允许增加/减少整数值 |
8 | QScrollBar 允许访问超出显示光圈的小部件内容 |
9 | QSlider 允许线性更改边界值。 |
10 | QComboBox 提供可供选择的项目的下拉列表 |
11 | QMenuBar 拿着QMenu对象的单杠 |
12 | QStatusBar 通常在QMainWindow的底部,提供状态信息。 |
13 | QToolBar 通常在QMainWindow顶部或浮动。 包含动作按钮 |
14 | QListView 在ListMode或IconMode中提供可选择的项列表 |
15 | QPixmap 用于在QLabel或QPushButton对象上显示的离屏图像表示 |
16 | QDialog 模态或无模式窗口,可以将信息返回到父窗口 |
典型的基于GUI的应用程序的顶级窗口由QMainWindow小部件对象创建。 上面列出的一些小部件在这个主窗口中占据指定位置,而其他小部件使用各种布局管理器放置在中央小部件区域中。
下图显示了QMainWindow框架 -
PyQt - Using Qt Designer
PyQt安装程序附带一个名为Qt Designer的GUI构建器工具。 使用其简单的拖放界面,可以快速构建GUI界面,而无需编写代码。 但是,它不是像Visual Studio这样的IDE。 因此,Qt Designer没有调试和构建应用程序的工具。
使用Qt Designer创建GUI界面首先要为应用程序选择顶级窗口。
然后,您可以从左窗格的窗口小部件框中拖放所需的窗口小部件。 您还可以为表单上放置的窗口小部件的属性赋值。
设计的表格保存为demo.ui. 此ui文件包含设计中窗口小部件及其属性的XML表示。 通过使用pyuic4命令行实用程序将此设计转换为Python等效项。 该实用程序是uic模块的包装器。 pyuic4的用法如下 -
pyuic4 –x demo.ui –o demo.py
在上面的命令中,-x开关将少量额外代码添加到生成的XML中,以便它成为可自执行的独立应用程序。
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
Dialog = QtGui.QDialog()
ui = Ui_Dialog()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
执行生成的python脚本以显示以下对话框 -
用户可以在输入字段中输入数据,但单击“添加”按钮不会生成任何操作,因为它与任何功能都没有关联。 对用户生成的响应做出反应称为event handling 。
PyQt - Signals & Slots
与以顺序方式执行的控制台模式应用程序不同,基于GUI的应用程序是事件驱动的。 执行函数或方法以响应用户的操作,例如单击按钮,从集合中选择项目或鼠标单击等,称为events 。
用于构建GUI界面的窗口小部件充当此类事件的来源。 每个PyQt小部件都是从QObject类派生的,旨在发出“ signal ”以响应一个或多个事件。 信号本身不会执行任何操作。 相反,它“连接”到“ slot ”。 插槽可以是任何callable Python function 。
在PyQt中,信号和时隙之间的连接可以以不同的方式实现。 以下是最常用的技术 -
QtCore.QObject.connect(widget, QtCore.SIGNAL(‘signalname’), slot_function)
当窗口小部件发出信号时,调用slot_function的更方便的方法如下 -
widget.signal.connect(slot_function)
假设在单击按钮时是否要调用函数。 这里,点击的信号将连接到可调用的函数。 它可以通过以下两种技术中的任何一种来实现 -
QtCore.QObject.connect(button, QtCore.SIGNAL(“clicked()”), slot_function)
OR
button.clicked.connect(slot_function)
例子 (Example)
在以下示例中,在QDialog窗口中添加了两个QPushButton对象(b1和b2)。 我们想分别在点击b1和b2时调用函数b1_clicked()和b2_clicked()。
单击b1时,clicked()信号连接到b1_clicked()函数
b1.clicked.connect(b1_clicked())
单击b2时,clicked()信号连接到b2_clicked()函数
QObject.connect(b2, SIGNAL("clicked()"), b2_clicked)
例子 (Example)
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
def window():
app = QApplication(sys.argv)
win = QDialog()
b1 = QPushButton(win)
b1.setText("Button1")
b1.move(50,20)
b1.clicked.connect(b1_clicked)
b2 = QPushButton(win)
b2.setText("Button2")
b2.move(50,50)
QObject.connect(b2,SIGNAL("clicked()"),b2_clicked)
win.setGeometry(100,100,200,100)
win.setWindowTitle("PyQt")
win.show()
sys.exit(app.exec_())
def b1_clicked():
print "Button 1 clicked"
def b2_clicked():
print "Button 2 clicked"
if __name__ == '__main__':
window()
上面的代码产生以下输出 -
输出 (Output)
Button 1 clicked
Button 2 clicked
PyQt - Layout Management
通过指定以像素为单位测量的绝对坐标,可以将GUI小部件放置在容器窗口内。 坐标相对于setGeometry()方法定义的窗口的尺寸。
setGeometry() syntax
QWidget.setGeometry(xpos, ypos, width, height)
在下面的代码段中,300 x 200像素尺寸的顶级窗口显示在显示器上的位置(10,10)。
import sys
from PyQt4 import QtGui
def window():
app = QtGui.QApplication(sys.argv)
w = QtGui.QWidget()
b = QtGui.QPushButton(w)
b.setText("Hello World!")
b.move(50,20)
w.setGeometry(10,10,300,200)
w.setWindowTitle(“PyQt”)
w.show()
sys.exit(app.exec_())
if __name__ == '__main__':
window()
PushButton小部件添加到窗口中,并放置在右侧50像素和窗口左上角位置20像素的位置。
然而,由于以下原因,这种Absolute Positioning不合适 -
即使调整窗口大小,窗口小部件的位置也不会改变。
在具有不同分辨率的不同显示设备上外观可能不均匀。
布局中的修改很困难,因为它可能需要重新设计整个表单。
PyQt API提供了布局类,可以更加优雅地管理容器内小部件的定位。 布局管理者优于绝对定位的优势是 -
窗口内的窗口小部件会自动调整大小。
确保在具有不同分辨率的显示设备上均匀外观。
无需重新设计即可动态添加或删除小部件。
这是我们将在本章中逐一讨论的类列表。
Sr.No. | 课程和描述 |
---|---|
1 | QBoxLayout QBoxLayout类垂直或水平排列小部件。 它的派生类是QVBoxLayout(用于垂直排列小部件)和QHBoxLayout(用于水平排列小部件)。 |
2 | QGridLayout GridLayout类对象显示按行和列排列的单元格网格。 该类包含addWidget()方法。 可以通过指定单元格的行数和列数来添加任何窗口小部件。 |
3 | QFormLayout QFormLayout是创建两个列表单的便捷方式,其中每一行包含与标签关联的输入字段。 作为约定,左列包含标签,右列包含输入字段。 |
PyQt - Basic Widgets
以下是我们将在本章中逐一讨论的小部件列表。
Sr.No | 小部件和描述 |
---|---|
1 | QLabel QLabel对象充当占位符以显示不可编辑的文本或图像,或充当动画GIF的影片。 它还可以用作其他小部件的助记键。 |
2 | QLineEdit QLineEdit对象是最常用的输入字段。 它提供了一个框,其中可以输入一行文本。 要输入多行文本,需要QTextEdit对象。 |
3 | QPushButton 在PyQt API中,QPushButton类对象提供了一个按钮,单击该按钮可以编程以调用某个功能。 |
4 | QRadioButton QRadioButton类对象提供带有文本标签的可选按钮。 用户可以选择表单上显示的众多选项之一。 此类派生自QAbstractButton类。 |
5 | QCheckBox 将QCheckBox对象添加到父窗口时,会出现文本标签前的矩形框。 就像QRadioButton一样,它也是一个可选择的按钮。 |
6 | QComboBox QComboBox对象显示可供选择的项目的下拉列表。 只需要显示当前所选项目所需的表单上的最小屏幕空间。 |
7 | QSpinBox QSpinBox对象向用户显示一个文本框,该文本框右侧显示带有向上/向下按钮的整数。 |
8 | QSlider小工具和信号 QSlider类对象为用户提供了一个可以移动手柄的凹槽。 它是一个控制有界值的经典小部件。 |
9 | QMenuBar,QMenu和QAction QMainWindow对象标题栏正下方的水平QMenuBar保留用于显示QMenu对象。 |
10 | QToolBar QToolBar小部件是一个可移动的面板,由文本按钮,带图标的按钮或其他小部件组成。 |
11 | QInputDialog 这是一个预先配置的对话框,带有文本字段和两个按钮,确定和取消。 用户单击“确定”按钮或按Enter后,父窗口将在文本框中收集输入。 |
12 | QFontDialog 另一个常用的对话框,字体选择器小部件是QDialog类的视觉外观。 此对话框的结果是Qfont对象,可以由父窗口使用。 |
13 | QFileDialog 此小部件是文件选择器对话框。 它使用户能够浏览文件系统并选择要打开或保存的文件。 通过静态函数或通过调用对话框对象上的exec_()函数来调用该对话框。 |
14 | QTab 如果表单有太多字段无法同时显示,则可以将它们排列在选项卡式窗口小部件的每个选项卡下的不同页面中。 QTabWidget提供标签栏和页面区域。 |
15 | QStacked QStackedWidget的功能类似于QTabWidget。 它还有助于有效使用窗口的客户区域。 |
16 | QSplitter 如果表单有太多字段无法同时显示,则可以将它们排列在选项卡式窗口小部件的每个选项卡下的不同页面中。 QTabWidget提供标签栏和页面区域。 |
17 | QDock 可停靠窗口是一个子窗口,可以保持浮动状态,也可以在指定位置附加到主窗口。 QMainWindow类的主窗口对象具有为可停靠窗口保留的区域。 |
18 | QStatusBar QMainWindow对象在底部保留一个水平条作为状态栏。 它用于显示永久或上下文状态信息。 |
19 | QList QListWidget类是一个基于项的界面,用于在列表中添加或删除项。 列表中的每个项目都是QListWidgetItem对象。 ListWidget可以设置为多选。 |
20 | QScrollBar 滚动条控件使用户能够访问可视区域外的文档部分。 它为当前位置提供视觉指示。 |
21 | QCalendar QCalendar小部件是一个有用的日期选择器控件。 它提供了基于月份的视图。 用户可以通过使用鼠标或键盘选择日期,默认为今天的日期。 |
PyQt - QDialog Class
QDialog小部件提供了一个顶级窗口,主要用于收集用户的响应。 它可以配置为Modal (它阻止其父窗口)或Modeless (可以绕过对话框窗口)。
PyQt API有许多预配置的Dialog小部件,如InputDialog,FileDialog,FontDialog等。
例子 (Example)
在以下示例中,Dialog窗口的WindowModality属性决定它是模态还是无模式。 对话框上的任何一个按钮都可以设置为默认值。 当用户按下Escape键时,QDialog.reject()方法将丢弃该对话框。
顶级QWidget窗口上的PushButton,单击时会生成一个Dialog窗口。 对话框在其标题栏上没有最小化和最大化控件。
用户无法在后台下载此对话框,因为其WindowModality设置为ApplicationModal。
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
def window():
app = QApplication(sys.argv)
w = QWidget()
b = QPushButton(w)
b.setText("Hello World!")
b.move(50,50)
b.clicked.connect(showdialog)
w.setWindowTitle("PyQt Dialog demo")
w.show()
sys.exit(app.exec_())
def showdialog():
d = QDialog()
b1 = QPushButton("ok",d)
b1.move(50,50)
d.setWindowTitle("Dialog")
d.setWindowModality(Qt.ApplicationModal)
d.exec_()
if __name__ == '__main__':
window()
上面的代码产生以下输出 -
PyQt - QMessageBox
QMessageBox是一个常用的模式对话框,用于显示一些信息性消息,并可选择通过单击其上的任何一个标准按钮来要求用户进行响应。 每个标准按钮都有一个预定义的标题,一个角色,并返回一个预定义的十六进制数字。
下表中给出了与QMessageBox类关联的重要方法和枚举 -
Sr.No. | 方法和描述 |
---|---|
1 | setIcon() 显示与消息严重性对应的预定义图标 题 信息 警告 危急 |
2 | setText() 设置要显示的主消息的文本 |
3 | setInformativeText() 显示其他信息 |
4 | setDetailText() 对话框显示“详细信息”按钮。 单击时会显示此文本 |
5 | setTitle() 显示对话框的自定义标题 |
6 | setStandardButtons() 要显示的标准按钮列表。 每个按钮都与之相关联 QMessageBox.Ok 0x00000400 QMessageBox.Open 0x00002000 QMessageBox.Save 0x00000800 QMessageBox.Cancel 0x00400000 QMessageBox.Close 0x00200000 QMessageBox.Yes 0x00004000 QMessageBox.No 0x00010000 QMessageBox.Abort 0x00040000 QMessageBox.Retry 0x00080000 QMessageBox.Ignore 0x00100000 |
7 | setDefaultButton() 将按钮设置为默认值。 如果按Enter键,它会发出单击的信号 |
8 | setEscapeButton() 如果按下转义键,则将按钮设置为单击 |
例子 (Example)
在以下示例中,单击顶级窗口上按钮的信号,连接的功能将显示消息框对话框。
msg = QMessageBox()
msg.setIcon(QMessageBox.Information)
msg.setText("This is a message box")
msg.setInformativeText("This is additional information")
msg.setWindowTitle("MessageBox demo")
msg.setDetailedText("The details are as follows:")
setStandardButton()函数显示所需的按钮。
msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
buttonClicked()信号连接到槽功能,该功能识别信号源的标题。
msg.buttonClicked.connect(msgbtn)
该示例的完整代码如下 -
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
def window():
app = QApplication(sys.argv)
w = QWidget()
b = QPushButton(w)
b.setText("Show message!")
b.move(50,50)
b.clicked.connect(showdialog)
w.setWindowTitle("PyQt Dialog demo")
w.show()
sys.exit(app.exec_())
def showdialog():
msg = QMessageBox()
msg.setIcon(QMessageBox.Information)
msg.setText("This is a message box")
msg.setInformativeText("This is additional information")
msg.setWindowTitle("MessageBox demo")
msg.setDetailedText("The details are as follows:")
msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
msg.buttonClicked.connect(msgbtn)
retval = msg.exec_()
print "value of pressed message box button:", retval
def msgbtn(i):
print "Button pressed is:",i.text()
if __name__ == '__main__':
window()
上面的代码产生以下输出 -
PyQt - Multiple Document Interface
典型的GUI应用程序可以具有多个窗口。 选项卡式和堆叠式小部件允许一次激活一个这样的窗口。 但是,很多时候这种方法可能没有用,因为隐藏了其他窗口的视图。
同时显示多个窗口的一种方法是将它们创建为独立窗口。 这称为SDI(单文档接口)。 这需要更多的内存资源,因为每个窗口可能有自己的菜单系统,工具栏等。
MDI(多文档界面)应用程序消耗较少的内存资源。 子窗口相对于彼此放置在主容器内。 容器小部件称为QMdiArea 。
QMdiArea小部件通常占用QMainWondow对象的中央小部件。 此区域中的子窗口是QMdiSubWindow类的实例。 可以将任何QWidget设置为subWindow对象的内部窗口小部件。 MDI区域中的子窗口可以以级联或平铺方式排列。
下表列出了QMdiArea类和QMdiSubWindow类的重要方法 -
Sr.No. | 方法和描述 |
---|---|
1 | addSubWindow() 在MDI区域中添加一个小部件作为新的子窗口 |
2 | removeSubWindow() 删除作为子窗口的内部窗口小部件的窗口小部件 |
3 | setActiveSubWindow() 激活子窗口 |
4 | cascadeSubWindows() 以级联方式在MDiArea中安排子窗口 |
5 | tileSubWindows() 以平铺方式在MDiArea中排列子窗口 |
6 | closeActiveSubWindow() 关闭活动子窗口 |
7 | subWindowList() 返回MDI区域中子窗口的列表 |
8 | setWidget() 将QWidget设置为QMdiSubwindow实例的内部窗口小部件 |
QMdiArea对象发出subWindowActivated()信号,而windowStateChanged()信号由QMdisubWindow对象发出。
例子 (Example)
在以下示例中,包含QMainWindow的顶级窗口具有菜单和MdiArea。
self.mdi = QMdiArea()
self.setCentralWidget(self.mdi)
bar = self.menuBar()
file = bar.addMenu("File")
file.addAction("New")
file.addAction("cascade")
file.addAction("Tiled")
菜单的Triggered()信号连接到windowaction()函数。
file.triggered[QAction].connect(self.windowaction)
菜单的新操作在MDI区域中添加一个子窗口,其标题具有增量编号。
MainWindow.count = MainWindow.count+1
sub = QMdiSubWindow()
sub.setWidget(QTextEdit())
sub.setWindowTitle("subwindow"+str(MainWindow.count))
self.mdi.addSubWindow(sub)
sub.show()
菜单的级联和平铺按钮分别以级联和平铺的方式排列当前显示的子窗口。
完整的代码如下 -
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MainWindow(QMainWindow):
count = 0
def __init__(self, parent = None):
super(MainWindow, self).__init__(parent)
self.mdi = QMdiArea()
self.setCentralWidget(self.mdi)
bar = self.menuBar()
file = bar.addMenu("File")
file.addAction("New")
file.addAction("cascade")
file.addAction("Tiled")
file.triggered[QAction].connect(self.windowaction)
self.setWindowTitle("MDI demo")
def windowaction(self, q):
print "triggered"
if q.text() == "New":
MainWindow.count = MainWindow.count+1
sub = QMdiSubWindow()
sub.setWidget(QTextEdit())
sub.setWindowTitle("subwindow"+str(MainWindow.count))
self.mdi.addSubWindow(sub)
sub.show()
if q.text() == "cascade":
self.mdi.cascadeSubWindows()
if q.text() == "Tiled":
self.mdi.tileSubWindows()
def main():
app = QApplication(sys.argv)
ex = MainWindow()
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
上面的代码产生以下输出 -
PyQt - Drag & Drop
drag and drop的提供对于用户来说非常直观。 它存在于许多桌面应用程序中,用户可以将对象从一个窗口复制或移动到另一个窗口。
基于MIME的拖放数据传输基于QDrag类。 QMimeData对象将数据与其对应的MIME类型相关联。 它存储在剪贴板上,然后用于拖放过程。
以下QMimeData类函数允许方便地检测和使用MIME类型。
测试仪 | 消气 | 二传手 | MIME类型 |
---|---|---|---|
hasText() | text() | setText() | text/plain |
hasHtml() | html() | setHtml() | text/html |
hasUrls() | urls() | setUrls() | text/uri-list |
hasImage() | imageData() | setImageData() | 图片/ * |
hasColor() | colorData() | setColorData() | application/x-color |
许多QWidget对象支持拖放活动。 允许拖动数据的那些包含setDragEnabled(),必须将其设置为true。 另一方面,小部件应响应拖放事件,以便存储拖入其中的数据。
DragEnterEvent提供一个事件,当拖动操作进入时,该事件将发送到目标窗口小部件。
拖放操作正在进行时使用DragMoveEvent 。
拖放操作离开窗口小部件时会生成DragLeaveEvent 。
另一方面, DropEvent在完成放置时发生。 可以有条件地接受或拒绝该事件的建议行动。
例子 (Example)
在以下代码中,DragEnterEvent验证事件的MIME数据是否包含文本。 如果是,则接受事件的建议操作,并将文本添加为ComboBox中的新项目。
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class combo(QComboBox):
def __init__(self, title, parent):
super(combo, self).__init__( parent)
self.setAcceptDrops(True)
def dragEnterEvent(self, e):
print e
if e.mimeData().hasText():
e.accept()
else:
e.ignore()
def dropEvent(self, e):
self.addItem(e.mimeData().text())
class Example(QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
lo = QFormLayout()
lo.addRow(QLabel("Type some text in textbox and drag it into combo box"))
edit = QLineEdit()
edit.setDragEnabled(True)
com = combo("Button", self)
lo.addRow(edit,com)
self.setLayout(lo)
self.setWindowTitle('Simple drag & drop')
def main():
app = QApplication(sys.argv)
ex = Example()
ex.show()
app.exec_()
if __name__ == '__main__':
main()
上面的代码产生以下输出 -
PyQt - Database Handling
PyQt API包含一个复杂的类系统,可与许多基于SQL的数据库进行通信。 它的QSqlDatabase通过Connection对象提供访问。 以下是当前可用的SQL驱动程序列表 -
Sr.No. | 驱动程序类型和描述 |
---|---|
1 | QDB2 IBM DB2 |
2 | QIBASE Borland InterBase驱动程序 |
3 | QMYSQL MySQL驱动程序 |
4 | QOCI Oracle调用接口驱动程序 |
5 | QODBC ODBC驱动程序(包括Microsoft SQL Server) |
6 | QPSQL PostgreSQL驱动程序 |
7 | QSQLITE SQLite版本3或更高版本 |
8 | QSQLITE2 SQLite版本2 |
例子 (Example)
使用静态方法建立与SQLite数据库的连接 -
db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sports.db')
QSqlDatabase类的其他方法如下 -
Sr.No. | 方法和描述 |
---|---|
1 | setDatabaseName() 设置要与其建立连接的数据库的名称 |
2 | setHostName() 设置安装数据库的主机的名称 |
3 | setUserName() 指定连接的用户名 |
4 | setPassword() 设置连接对象的密码(如果有) |
5 | commit() 提交事务并在成功时返回true |
6 | rollback() 回滚数据库事务 |
7 | close() 关闭连接 |
QSqlQuery类具有执行和操作SQL命令的功能。 可以执行DDL和DML类型的SQL查询。 该类中最重要的方法是exec_(),它将包含要执行的SQL语句的字符串作为参数。
query = QtSql.QSqlQuery()
query.exec_("create table sportsmen(id int primary key,
" "firstname varchar(20), lastname varchar(20))")
以下脚本创建一个SQLite数据库sports.db,其中包含一个填充了五个记录的运动员表。
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()
PyQt中的QSqlTableModel类是一个高级接口,它提供可编辑的数据模型,用于在单个表中读取和写入记录。 此模型用于填充QTableView对象。 它向用户呈现可滚动和可编辑的视图,可以放在任何顶级窗口上。
QTableModel对象以下列方式声明 -
model = QtSql.QSqlTableModel()
其编辑策略可以设置为以下任何一种 -
QSqlTableModel.OnFieldChange | 所有更改将立即应用 |
QSqlTableModel.OnRowChange | 当用户选择其他行时,将应用更改 |
QSqlTableModel.OnManualSubmit | 所有更改都将被缓存,直到调用submitAll()或revertAll() |
例子 (Example)
在以下示例中,sportsperson表用作模型,策略设置为 -
model.setTable('sportsmen')
model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
model.select()
QTableView类是PyQt中Model/View框架的一部分。 QTableView对象创建如下 -
view = QtGui.QTableView()
view.setModel(model)
view.setWindowTitle(title)
return view
此QTableView对象和两个QPushButton小部件将添加到顶级QDialog窗口。 添加按钮的Clicked()信号连接到addrow(),它在模型表上执行insertRow()。
button.clicked.connect(addrow)
def addrow():
print model.rowCount()
ret = model.insertRows(model.rowCount(), 1)
print ret
与删除按钮相关联的Slot执行lambda函数,该函数删除由用户选择的行。
btn1.clicked.connect(lambda: model.removeRow(view1.currentIndex().row()))
完整的代码如下 -
import sys
from PyQt4 import QtCore, QtGui, QtSql
import sportsconnection
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_())
上面的代码产生以下输出 -
PyQt - Drawing API
PyQt中的所有QWidget类都是从QPaintDevice类中分类的。 QPaintDevice是二维空间的抽象,可以使用QPainter绘制。 涂料装置的尺寸以像素为单位从左上角开始测量。
QPainter类在小部件和其他可绘制设备(如打印机)上执行低级绘制。 通常,它用于小部件的绘制事件。 每当窗口小部件的外观更新时,都会发生QPaintEvent 。
通过调用begin()方法激活画家,而end()方法将其取消激活。 在两者之间,通过下表中列出的合适方法绘制所需图案。
Sr.No. | 方法和描述 |
---|---|
1 | begin() 开始在目标设备上绘画 |
2 | drawArc() 在起始角度和结束角度之间绘制弧度 |
3 | drawEllipse() 在矩形内绘制一个椭圆 |
4 | drawLine() 绘制一条指定了端点坐标的线 |
5 | drawPixmap() 从图像文件中提取pixmap并将其显示在指定位置 |
6 | drwaPolygon() 使用坐标数组绘制多边形 |
7 | drawRect() 从给定宽度和高度的左上角坐标开始绘制一个矩形 |
8 | drawText() 显示给定坐标处的文本 |
9 | fillRect() 使用QColor参数填充矩形 |
10 | setBrush() 设置绘画的画笔样式 |
11 | setPen() 设置用于绘图的笔的颜色,大小和样式 |
PyQt - BrushStyle Constants
预定义的QColor样式
Qt.NoBrush | 没有画笔图案 |
Qt.SolidPattern | 颜色均匀 |
Qt.Dense1Pattern | 非常密集的画笔图案 |
Qt.HorPattern | 水平线 |
Qt.VerPattern | 垂直线条 |
Qt.CrossPattern | 穿过水平和垂直线 |
Qt.BDiagPattern | 向后的对角线 |
Qt.FDiagPattern | 前向对角线 |
Qt.DiagCrossPattern | 穿越对角线 |
预定义的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 |
可以通过指定RGB或CMYK或HSV值来选择自定义颜色。
例子 (Example)
以下示例实现了其中一些方法。
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 Pyth
on")
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()
上面的代码产生以下输出 -
PyQt - QClipboard
QClipboard类提供对系统范围剪贴板的访问,该剪贴板提供了一种在应用程序之间复制和粘贴数据的简单机制。 它的操作类似于QDrag类,并使用类似的数据类型。
QApplication类有一个静态方法clipboard(),它返回对剪贴板对象的引用。 可以从剪贴板复制或粘贴任何类型的MimeData。
以下是常用的剪贴板类方法 -
Sr.No. | 方法和描述 |
---|---|
1 | clear() 清除剪贴板内容 |
2 | setImage() 将QImage复制到剪贴板 |
3 | setMimeData() 将MIME数据设置为剪贴板 |
4 | setPixmap() 复制剪贴板中的Pixmap对象 |
5 | setText() 在剪贴板中复制QString |
6 | text() 从剪贴板中检索文本 |
与剪贴板对象关联的信号是 -
Sr.No. | 方法和描述 |
---|---|
1 | dataChanged() 每当剪贴板数据发生变化 |
例子 (Example)
在以下示例中,两个TextEdit对象和两个按钮被添加到顶级窗口。
首先,实例化剪贴板对象。 textedit对象的Copy()方法将数据复制到系统剪贴板上。 单击“粘贴”按钮时,它将获取剪贴板数据并将其粘贴到其他textedit对象中。
PyQt - QPixmap Class
QPixmap类提供图像的离屏表示。 它可以用作QPaintDevice对象,也可以加载到另一个小部件中,通常是标签或按钮。
Qt API有另一个类似的QImage类,它针对I/O和其他像素操作进行了优化。 另一方面,Pixmap经过优化,可以在屏幕上显示。 两种格式都是可互换的。
可以读入QPixmap对象的图像文件类型如下 -
BMP | Windows位图 |
GIF | 图形交换格式(可选) |
JPG | 联合图像专家组 |
JPEG | 联合图像专家组 |
PNG | 便携式网络图形 |
PBM | 便携式位图 |
PGM | 便携式灰度图 |
PPM | 便携式Pixmap |
XBM | X11位图 |
XPM | X11 Pixmap |
以下方法在处理QPixmap对象时很有用 -
Sr.No. | 方法和描述 |
---|---|
1 | copy() 从QRect对象复制像素图数据 |
2 | fromImage() 将QImage对象转换为QPixmap |
3 | grabWidget() 从给定的小部件创建一个像素图 |
4 | grabWindow() 在窗口中创建数据的pixmap |
5 | Load() 将图像文件加载为像素图 |
6 | save() 将QPixmap对象保存为文件 |
7 | toImage 将QPixmap转换为QImage |
QPixmap最常见的用途是在标签/按钮上显示图像。
例子 (Example)
以下示例显示使用setPixmap()方法在QLabel上显示的图像。 完整的代码如下 -
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()
上面的代码产生以下输出 -