PyQt布局管理、菜单和工具栏
1 应用程序的图标
# 设置窗口的位置和大小
self.setGeometry(300, 300, 600, 500)
# 设置窗口的标题
self.setWindowTitle('Icon')
# 设置窗口的图标,引用当前目录下的icon.png图片
self.setWindowIcon(QIcon('icon.png'))
2. 关闭窗口
btn.clicked.connect(QCoreApplication.instance().quit)
3. 消息框
一般情况下,点击X表现关闭窗口。现在重写 closeEvent 函数,关闭窗口时会弹出一个消息框,让你确认是否关闭窗口。
def closeEvent(self, event):
reply = QMessageBox.question(self,'Message',
"Are you sure to quit?",QMessageBox.Yes | QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
4. 窗口显示在屏幕的中间
def center(self):
# 获得窗口
qr = self.frameGeometry()
# 获得屏幕中心点
cp = QDesktopWidget().availableGeometry().center()
# 显示到屏幕中心
qr.moveCenter(cp)
self.move(qr.topLeft())
5. 框布局 Boxlayout
用 QHBoxLayout 和 QVBoxLayout ,来分别创建横向布局和纵向布局。
def setup_UI(self):
okButton = QPushButton("OK")
cancelButton = QPushButton("Cancel")
# 使用HBoxLayout和QVBoxLayout并添加伸展因子,在窗口的右下角显示两个按钮。
hbox = QHBoxLayout()
hbox.addStretch(1) # 平分空白间隔的,参数默认是0,用来增加间隔
hbox.addWidget(okButton) # 用于向布局中添加控件
hbox.addWidget(cancelButton)
self.setLayout(hbox)
# 创建一个水平布局和添加一个伸展因子和两个按钮。两个按钮前的伸展增加了一个可伸缩的空间。
# 这将推动他们靠右显示。
vbox = QVBoxLayout()
vbox.addStretch(1)
vbox.addLayout(hbox)
# 创建一个垂直布局,并添加伸展因子,让水平布局显示在窗口底部
self.setLayout(vbox) # 用于向布局中添加子布局
self.resize(300,300)
self.setWindowTitle('Buttons')
6. 表格布局 QGridLayout
表格布局将空间划分为行和列,可以使用 QGridLayout 类创建一个网格布局。
def setup_UI(self):
grid = QGridLayout()
self.setLayout(grid)
names = ['Cls', 'Bck', '', 'Close',
'7', '8', '9', '/',
'4', '5', '6', '*',
'1', '2', '3', '-',
'0', '.', '=', '+']
positions = [(i, j) for i in range(5) for j in range(4)]
# 构建一个二维positions列表
# name:依次遍历names赋值给name
# position:依次遍历列表positions赋值(元组)给position
for position, name in zip(positions, names):
if name == '':
continue
button = QPushButton(name)
# 创建按钮并使用addWidget()方法添加到布局中。
grid.addWidget(button, *position)
self.move(300, 150)
self.setWindowTitle('Calculator')
7. QGridLayout 可以在网格中跨越多个行或列
def setup_UI(self):
title = QLabel('Title')
author = QLabel('Author')
review = QLabel('Review')
titleEdit = QLineEdit()
authorEdit = QLineEdit()
reviewEdit = QTextEdit()
grid = QGridLayout()
grid.setSpacing(10) # 表示各个控件之间的上下间距
grid.addWidget(title, 1, 0)
grid.addWidget(titleEdit, 1, 1)
grid.addWidget(author, 2, 0)
grid.addWidget(authorEdit, 2, 1)
grid.addWidget(review, 3, 0)
grid.addWidget(reviewEdit, 3, 1, 5, 1)
self.setLayout(grid)
self.setGeometry(300, 300, 350, 300)
self.setWindowTitle('Review')
8. 主窗口
QMainWindow 类提供了一个主要的应用程序窗口,用它可以让应用程序添加状态栏,工具栏和菜单栏。
8.1 状态栏
状态栏用于显示状态信息。
def setup_UI(self):
# QMainWindow类第一次调用statusBar()方法创建一个状态栏。
# 后续调用返回的状态栏对象。showMessage()状态栏上显示一条消息。
self.statusBar().showMessage('Ready')
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Statusbar')
8.2 菜单栏
菜单栏是常见的窗口应用程序的一部分。
def setup_UI(self):
# QAction可以操作菜单栏,工具栏,或自定义键盘快捷键。
# 下面三行,创建一个事件和一个特定的图标和一个“退出”的标签。
# 然后,在定义该操作的快捷键。
# 第三行创建一个鼠标指针悬停在该菜单项上时的提示。
exitAction = QAction(QIcon('画布.png'), '&Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.setStatusTip('Exit application') # 提示信息
exitAction.triggered.connect(qApp.quit)
self.statusBar()
# 创建一个菜单栏
menubar = self.menuBar()
# 添加菜单
fileMenu = menubar.addMenu('&File')
# 添加事件
fileMenu.addAction(exitAction)
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Menubar')
8.3 工具栏
def setup_UI(self):
exitAction = QAction(QIcon('画布.png'), 'Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.triggered.connect(qApp.quit)
# 工具栏
# 创建一个QAction事件。该事件有一个标签、图标和快捷键。
self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(exitAction)
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Toolbar')