1.每个应用必须创建一个 QtGui.QApplication(sys.argv), 此时 QtGui.qApp 为此应用的实例
app = QtGui.QApplication(sys.argv) sys.exit(app.exec_()); #因为exec是关键字, 所以 Qt 用的 exec_, app.exec_() 表示进入循环
2.所有界面图形类都继承自 QtGui.QWidget, 比如 QtGui.QPushButton 等都可以使用 setGeometry() 等方法, QWidget 如果没有指定父, 那么它就是顶级窗口
必须设置可以显示的父类, 或者调用自身的 show()/exec_() 方法才可以显示
3.QtGui.QPushButton('Quit', widget), 创建一个 QPushButton 实例, 放在 widget 上
4.PyQt4 事件处理系统建立在 信号-槽 的基础上
槽详解可以参考以下两篇文章, PyQt4信号和槽用法总结, 信号和槽详解
事件(Events) 是 GUI 程序中很重要的一部分, 它由用户或系统产生, 当我们调用程序的 exec_() 方法时, 程序就会进入主循环中, 主循环捕获事件并将它们发送给相应的对象进行处理, 当用户单击一个按钮, 拖动一个滑块或进行其它动作时, 相应的信号就会被发射, 除此之外, 信号还可以因为环境的变化而被发射, 比如一个运行的时钟将会发射时间信号等, 而所谓的槽则是一个方法, 该方法将会响应它所连接的信号
信号与槽机制作为 Qt 最重要的特性, 提供了任意两个 Qt 对象之间的通信机制, 信号会在某个特定情况或动作下被触发, 槽是用于接收并处理信号的函数
每个Qt对象都包含预定的信号和槽, 当一某一特定事件发生时, 一个信号被发射, 与信号相关联的槽则会响应信号完成相应的处理
信号与槽机制常用的连接方式为: connect(Object1,SIGNAL(signal),Object2,SLOT(slot)), 其中槽函数可以是 PyQt 自带的的槽函数, 也可以是自定义的槽函数(@QtCore.pyqtSlot()), 甚至是任何 Python 可以调用的函数
w.connect(btn, QtCore.SIGNAL("clicked()"), QtGui.qAPP, QtCore.SLOT("quit()"))
或
#coding:utf-8 from PyQt4 import QtGui, QtCore app = QtGui.QApplication([]) w = QtGui.QWidget() def showMsg(): QtGui.QMessageBox.information(w, u"信息", u"ok") btn = QtGui.QPushButton(u"点我", w) w.connect(btn, QtCore.SIGNAL("clicked()"), showMsg) #或者 btn.clicked.connect(showMsg) w.show() app.exec_()
button 对象的 clicked() 信号连接到 showMsg 函数, 也就是说 ShowMsg 响应了一个按钮的点击事件
5.建立带菜单栏、工具栏、状态栏的窗口, 可使用或者继承 QMainWindow 类
statusBar(), menuBar(), addToolBar() 返回对应的类实例
fileMenu = xxx.menuBar().addMenu("&File")
fileMenu.addAction(aaa)
同理 toolBar
6.布局方式:
绝对定位: 使用 move(), setGeometry()
盒子定位: QHBoxLayout(水平定位), QVBoxLayout(垂直定位)
网格定位: QGridLayout(addWidget 的时候可以指定行或列的跨度)
addStretch() 增加一个可伸缩的占位符, 也相当于一个元素, 其中在添加 Widget 的时候也可以指定 stretch, 表示伸缩比例
addSpacing() 增加一个固定宽高的空白符
在使用布局时, 可以不指定控件的父窗口, 当父窗口 addLayout() 或者 setLayout() 时, 布局内的所有控件都会重定义其父窗口到父窗口
布局对象.setSizeConstraint(val) 用来设置窗体约束尺寸, 比如 val 可以为 QLayout.setFixedSize
6.常见对话框 QColorDialog、QErrorMessage、QFileDialog、QFontDialog、QInputDialog、QMessageBox、QProgressDialog、QTabDialog、QWizard
7.常用控件类
空白占位符: QSpacerItem
图标: QIcon
气泡: QToolTip
按钮: QPushButton
按钮组: QButtonGroup
会话框按钮组: QDialogButtonBox
文本: QLabel
时间编辑器: QDateTimeEdit
单文本编辑器: QLineEdit
多文本编辑器: QTextEdit
加减数字: QSpinBox
数字LCD显示器: QLCDNumber(槽 display(int))
滑动条: QSlider(信号 valueChanged(int) 等)
颜色类: QColor
窗口或控件的调色板: QPalette, 每个窗口或空间都会有, 此类有两个基本概念: ColorGroup(包括焦点/失去/不可用) 和 ColorRole(指窗体的哪部分)
图片类: QPixMap(主要用来显示图片), QImage(主要用来修改图片), label->setPixMap(QtGui.QPixMap("icon/logo.png"))
进度条: QProgressBar
计时器: QBasicTimer, QTimer, 配合 "timeout()" 信号, 或者重定义 timerEvent 事件
时间: QTime
单选框: QRadioButton
多选框: QCheckbox
下拉列表: QStringList
下拉列表: QComboBox
图片按钮: QToolButton
工具箱列表: QToolBox
表格: QTableWidget
标签栏: QTabWidget
多窗口: QWorkspace, 使用时可以用 QMainWindow 实例的 setCentralWidget(QWorkspace())
分割窗口: QSplitter
可挪动窗口: QDockWidget
菜单: QMenu
菜单栏/工具栏按钮: QAction, "triggered()"
堆栈窗口实现: QListWidget, QStackedWidget 分别配合自身的 currentRowChanged(int) 和 setCurrentIndex(int) 实现, 另需配合 QSplitter
启动画面: QSplashScreen
打印机: QPrinter, QPrintDialog
8.信号与槽
所有继承自 QObject 的类都可以发射信号, emit 方法用来发射信号
自定义信号
class Emit(QtGui.QWidget): def __init__(self, parent = None): QtGui.QWidget.__ini__(self, parent) self.setWindowTitle("Emit") self.resize(250, 150) self.connect(self, QtCore.SIGNAL("closeEmitApp()"), self, QtCore.SLOT("close()")) def mousePressEvent(self, event): self.emit(QtCore.SIGNAL("closeEmitApp()"))
clicked(), 被点击时
valueChanged(int), 数值被该表时
triggered() 菜单栏/工具栏被触发时
9.槽
quit()
10.位置坐标等函数
self.x()
self.y()
self.frameGeometry().x(), self.frameGeometry().y(), self.frameGeometry().width(), self.frameGeometry().height()
self.pos().x(), self.pos().y()
self.geometry().x(), self.geometry().y(), self.geometry().width(), self.geometry().height()
self.width()
self.height()
self.rect().x(), self.rect().y(), self.rect().width(), self.rect().height()
self.size().width(), self.size().height()
rect()和 size(),调用它们获得的结果也都是对于窗体的中央区域而言的, size() 获得的是窗体中央区域的长,宽值, rect()与 geometry()一样返回一个 QRect 对象。其中, 两个函数获得的长,宽值是一样的,都是窗体中央区域的长,宽值,只是左上顶点坐标值不 一样, geometry()获得的左上顶点坐标是相对于父窗体而言的坐标,而 rect()获得的左上顶 点坐标始终为(0,0)。
12.禁止最大化和调整
#禁止最大化按钮 其中MainWindow可以为任何QWidget MainWindow.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint) #禁止调整窗口大小 其中MainWindow可以为任何QWidget MainWindow.setFixedSize(MainWindow.width(), MainWindow.height());
13.创建颜色 Icon
for color in QColor.colorNames(): pix = QPixmap(QSize(70, 20)) pix.fill(QColor(color)) icon = QIcon(pix)
14.自定义移动
def mousePressEvent(self,event): if event.button()==Qt.LeftButton: self.dragPosition=event.globalPos()-self.frameGeometry().topLeft() event.accept() def mouseMoveEvent(self,event): if event.buttons() & Qt.LeftButton: self.move(event.globalPos()-self.dragPosition) event.accept()
15.在 QListWidget 中添加 QCheckBox 对象
list = QListWidget() item = QListWidgetItem() checkbox = QCheckBox(self.tr("英语")) list.addItem(item) list.setItemWidget(item, checkbox)
16.获取 QListWidget 中的 QWidget 对象
for i in range(list.count()): item = list.item(i) widget = list.itemWidget(item)
17.