PyQt5基本窗口控件(一)
包括 QMainWindow/QWidget/QLabel等三个重要部件
QMainWindow
QMainWindow主窗口为用户提供一个应用程序框架,可以在主窗口中添加控件,如工具栏、菜单栏、和状态栏。
窗口类型
QMainwindow
, QWidget
, QDialog
三个类都是用来创建窗口地,但是有区别
QMainwindow
:可以包含菜单栏,工具栏,状态栏,标题栏,是最常见的窗口形式,可以说是主窗口
QDialog
:是对话框的基类。对话框主要用于执行短期任务,或者与用户进行互动,它可以是模态的,也可以是非模态的,无工具栏状态栏和菜单栏
QWidget
:可能作为顶层窗口,或者嵌入到其他窗口中。
创建主窗口
父窗口:包含一个或多个窗口,没有父窗口的窗口被称为顶层窗口,QMainWindow
就是顶层窗口
子窗口:被父窗口包含
主窗口不能用setLayout()
方法自定义布局,因为他们有自己的布局。
QMainwindow
继承自QWidget
类,其重要的方法包括以下几种
addToolBar()
添加工具栏
centralWidget()
返回窗口中心的一个控件,未设置时返回NULL
menuBar()
返回主窗口的菜单栏
setCentralWidget()
设置窗口中心的控件
setStatusBar()
设置状态栏
statusBar()
用于获得状态栏对象,可以对对象调用showMessage(message, int timeout=0)
方法显示状态栏信息
代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import sys from PyQt5.QtWidgets import QMainWindow, QApplication from PyQt5.QtGui import QIcon
class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.resize(400, 200) self.status = self.statusBar() self.status.showMessage("状态栏提示", 5000) self.setWindowTitle("QMainWindow")
if __name__ == '__main__': app = QApplication(sys.argv) app.setWindowIcon(QIcon("1.jpg")) form = MainWindow() form.show() sys.exit(app.exec_())
|
主窗口居中
QMainwindow.move(int, int)
是将窗口的左上角定位至屏幕上的坐标(见下)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| from PyQt5.QtWidgets import QDesktopWidget, QApplication, QMainWindow import sys
class winform(QMainWindow): def __init__(self, parent=None): super(winform, self).__init__(parent)
self.setWindowTitle('center') self.resize(370, 250) self.center()
def center(self): screen = QDesktopWidget().screenGeometry() size = self.geometry() self.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2)
if __name__ == '__main__': app = QApplication(sys.argv) win = winform() win.show() sys.exit(app.exec_())
|
QDesktopWidget().screenGeometry()
返回屏幕大小,.geometry()
方法可以获取QMainWindow
的大小,并通过.width()
和.height()
方法获取他们的值
关闭主窗口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| from PyQt5.QtWidgets import QMainWindow, QHBoxLayout, QPushButton, QApplication, QWidget import sys
class WinForm(QMainWindow):
def __init__(self, parent=None): super(WinForm, self).__init__(parent) self.setWindowTitle('close') self.button1 = QPushButton('close') self.button1.clicked.connect(self.on_button_clicked)
layout = QHBoxLayout() layout.addWidget(self.button1)
main_frame = QWidget() main_frame.setLayout(layout) self.setCentralWidget(main_frame)
def on_button_clicked(self): sender = self.sender() print(sender.text()+' clicked') qApp = QApplication.instance() qApp.quit()
if __name__ == '__main__': app = QApplication(sys.argv) form = WinForm() form.show() sys.exit(app.exec_())
|
.sender()
函数用于获取发送信号的对象,在这里即button1按钮,.text()
用于获取按钮的名称。
基础窗口控件QWidget类是所有用户界面对象的基类,所有窗口和控件都直接或间接继承自QWidget类。
- 窗口:没有嵌入到其他控件中的控件称为窗口
- 控件:按钮、复选框、文本框、表格、进度条
QWidget
提供的成员函数:x()
,y()
获得窗口左上角的坐标,width()
,height()
获得客户去的宽度和高度。
QWidget.geometry()
类提供成员函数:x()
,y()
获得客户去左上角坐标,width()
,height()
获得客户区的宽度和高度。
QWidget.frameGeometry()
提供的成员函数:x()
,y()
获得窗口左上角的坐标,width()
,height()
获取包含客户区、标题栏和边框在内的整个窗口的宽度和高度
常用的几何结构
不包含边框
- 客户区面积
1 2
| QWidget.resize(width, height) QWidget.resiez(QSize)
|
此时可以用鼠标来调整窗口大小
- 客户区大小
- 获取客户区域的宽度和高度
1 2
| QWiget.width() QWiget.height()
|
- 设置客户区的固定宽度和高度
1 2 3 4
| QWidget.setFixedWidth(int width) QWidget.setFixedHeigth(int height) QWidget.setFiexdSize(Qsize size) QWidget.setFiexdSize(int width, int height)
|
此时不能通过鼠标调整窗口大小。
同时改变面积和位置
1 2
| QWidget.setGeometry(int x, int y, int width, int height); QWidget.setGeometry(Qrect rect)
|
包含边框
获得窗口的大小和位置
1
| QWidget.frameGeometry() -> Qrect
|
- 设置窗口的位置
1 2
| QWidget.move(int x, int y) QWidget.move(QPoint point)
|
- 获得窗口左上角的位置
例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| from PyQt5.QtWidgets import QWidget, QApplication, QPushButton import sys
app = QApplication(sys.argv) widget = QWidget() btn = QPushButton(widget) btn.setText("Button")
btn.move(20, 20) widget.resize(300 ,200)
widget.move(250, 200) widget.setWindowTitle('PyQt坐标系统例子') widget.show()
print(widget.x(), widget.y()) print(widget.width(), widget.height()) print(widget.geometry().x(), widget.geometry().y()) sys.exit(app.exec_())
|
注意这里第一个print
返回的是窗口左上角位置,而第二个print
返回的是用户区左上角位置。
PyQt5应用
显示窗口和图标,并且可以修改大小,最大化,最小化。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import sys from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QApplication, QWidget
app = QApplication(sys.argv)
window = QWidget() window.resize(300, 200) window.move(250, 250) window.setWindowTitle("hello world") window.setWindowIcon(QIcon("./pyramid.svg")) window.show()
sys.exit(app.exec_())
|
显示气泡信息
QToolTip.setFont(QFont('SansSerif', 10))
用于设置提示气泡的字体和字号
self.setToolTip('This is a <b>tips</b>')
设置提示语的内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import sys from PyQt5.QtWidgets import QWidget, QToolTip, QApplication from PyQt5.QtGui import QFont
class win(QWidget): def __init__(self, parent=None): super(win, self).__init__(parent) self.initUI()
def initUI(self): QToolTip.setFont(QFont('SansSerif', 10)) self.setToolTip('This is a <b>tips</b>') self.setGeometry(200, 300, 400, 400) self.setWindowTitle('tips demo')
if __name__ == '__main__': app = QApplication(sys.argv) winf = win() winf.show() sys.exit(app.exec_())
|
QLabel
QLabel一般是一个占位符,可以显示不可编辑的文本、图片、GIF等
QLabel继承自QFrame类,而QFrame类继承自QWidget类
常用方法,
setAlignment()
按固定值对其文本,Qt.AlignLeft
(水平方向靠左对齐)/Qt.AlignRight
(水平方向靠右对其)/Qt.AlignCenter
(水平方向居中)/Qt.AlignJustify
(水平方向调整间距两端对齐)/Qt.AlignTop
(垂直方向靠上对齐)/At.AlignBottom
(垂直方向靠下对其)/Qt.AlignVCenter
(垂直方向居中对齐)
setIndent()
设置文本缩进值
setPixmap()
设置QLabel为一个Pixmap图片
text()
获得QLabel的文本内容
setText()
设置QLabel的文本内容
selectedText()
返回选择的文字
setBuddy()
设置QLabel的助记符以及buddy,这里略
setWordWrap()
设置是否允许换行
常用信号
linkActivated
:当单击标签中嵌入的超链接,希望在新窗口打开这个链接时,setOpenExternalLinks
必须设置为true
linkHovered
:当鼠标指针划过标签中嵌入的超链接时,需要用槽函数与这个信号绑定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| from PyQt5.QtWidgets import QMainWindow, QHBoxLayout, QPushButton, QApplication, QWidget import sys
class WinForm(QMainWindow):
def __init__(self, parent=None): super(WinForm, self).__init__(parent) self.setWindowTitle('close') self.button1 = QPushButton('close') self.button1.clicked.connect(self.on_button_clicked)
layout = QHBoxLayout() layout.addWidget(self.button1)
main_frame = QWidget() main_frame.setLayout(layout) self.setCentralWidget(main_frame) def on_button_clicked(self): sender = self.sender() print(sender.text()+' clicked') qApp = QApplication.instance() qApp.quit()
if __name__ == '__main__': app = QApplication(sys.argv) form = WinForm() form.show() sys.exit(app.exec_())
|
QLabel标签快捷键的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| from PyQt5.QtWidgets import * import sys
class QlabelDemo(QDialog): def __init__(self):
super().__init__() self.setWindowTitle("QLabelExample") nameLb1 = QLabel('&Name', self) nameEd1 = QLineEdit(self) nameLb1.setBuddy(nameEd1)
nameLb2 = QLabel('&Password', self) nameEd2 = QLineEdit(self) nameLb2.setBuddy(nameEd2)
btnOK = QPushButton('&OK') btnCancel = QPushButton('&Cancel') mainLayout = QGridLayout(self) mainLayout.addWidget(nameLb1, 0, 0) mainLayout.addWidget(nameEd1, 0, 1, 1, 2) mainLayout.addWidget(nameLb2, 1, 0) mainLayout.addWidget(nameEd2, 1, 1, 1, 2)
mainLayout.addWidget(btnOK, 2, 1) mainLayout.addWidget(btnCancel, 2, 2)
if __name__=='__main__': app = QApplication(sys.argv) labelDemo = QlabelDemo() labelDemo.show() sys.exit(app.exec_())
|
快捷键的使用,举例说明
nameLb2 = QLabel(‘&Password’, self)
“&”后面加的第一个首字母大写,这是我们一会儿用到的快捷键,
使用方式是Alt+&后面大写的第一个字母
这里正确的使用方式是Alt+P就可以快速定位到所绑定的伙伴控件上,后面的快捷键使用类似.