三、PyQt5基本窗口控件(QMain Window、Qwidget、QDialog、Qlabel、Spacers、QTextEdit、QLineEdit、菜单、工具栏、)
QMainWindow是Qt框架中的一个主窗口类,它提供了一个应用程序的主界面,可以包含菜单栏、工具栏、状态栏、中心窗口等各种窗口部件。在QMainWindow中,中心窗口是最重要的部分,它可以是任何Qt窗口部件,如QTextEdit、QTableView、QGraphicsView等。
QMainWindow可以通过Qt Designer进行设计和布局,也可以通过代码进行创建和配置。在使用Qt Designer时,可以拖放各种窗口部件到QMainWindow中,然后通过属性编辑器进行属性设置。在使用代码时,可以通过构造函数或者成员函数进行设置。
在Qt中,所有的用户界面部件都是从QWidget派生而来的,这意味着QWidget提供了一个通用的接口,以便于在不同的用户界面部件之间共享代码和实现。同时,QWidget也提供了一些常用的属性和方法,例如size()、pos()、setWindowTitle()等,以便于管理和操作界面部件。
在创建自定义用户界面部件时,我们可以从QWidget派生出我们自己的部件类,并通过重载其成员函数来实现自定义行为。例如,我们可以通过重载QWidget的paintEvent()函数来绘制自己的部件,或者通过重载其mousePressEvent()函数来处理鼠标点击事件。
总之,QWidget是Qt框架中所有用户界面部件的基类,提供了基本的用户界面功能,包括绘制、事件处理、布局等。它是Qt框架中非常重要和常用的部件之一,对于Qt开发者来说是必须要熟练掌握的。
QWidget是Qt框架中所有用户界面部件的基类,包括窗口、对话框、按钮、标签、文本框、图形视图等等,它提供了基本的用户界面功能,例如绘制、事件处理、布局等。而QMainWindow是QWidget的子类,是Qt框架中的一个主窗口类,它提供了一个应用程序的主界面,可以包含菜单栏、工具栏、状态栏、中心窗口等各种窗口部件。具体来说,QWidget与QMainWindow的区别如下:
布局不同:在QWidget中,需要通过布局管理器来管理部件的布局,而在QMainWindow中,布局管理器一般用于管理中心窗口的布局,其他部件则通过设置位置和大小来进行布局。
总的来说,QWidget和QMainWindow都是Qt框架中非常重要的用户界面部件,用于创建不同类型的界面。QWidget提供了基本的用户界面功能,适用于创建各种类型的窗口和控件,而QMainWindow则提供了应用程序主窗口的各种功能,适用于创建包含菜单栏、工具栏、状态栏等的应用程序主窗口。
Spacer控件可以帮助您在布局中创建空白区域,以便在界面上分隔其他控件,或者在其他控件周围留出空白区域。 Spacer控件的大小可以通过设置其大小策略(size policy)来控制。
Spacer控件有两种类型:水平(QSpacerItem)和垂直(QSpacerItem)。您可以使用QHBoxLayout或QVBoxLayout将Spacer控件添加到布局中。在添加Spacer控件时,您可以指定其最小大小、最大大小和首选大小,以及其大小策略。
QLabel是一个显示文本或图像的控件,它通常被用于显示静态文本信息。可以通过设置其文本、字体、颜色、对齐方式等属性来自定义标签的样式和布局。可以将QLabel放置在主窗口、对话框或其他控件上,以便在应用程序中提供帮助文本、说明、状态消息等。
QLineEdit是一个用于接收用户输入的单行文本编辑控件,它允许用户输入和编辑文本信息。可以设置QLineEdit的输入格式,例如只允许输入数字、字母或特定字符,或者限制输入的最大长度。可以使用信号和槽机制来处理用户输入的文本,以便在应用程序中执行特定的操作或验证用户输入的有效性。
在这个例子中,我们创建了一个整数校验器,并将其应用于QLineEdit控件,这样用户只能输入整数。然后,我们使用QFormLayout表单布局来组织控件,并将控件添加到布局中。最后,设置窗口布局和大小,并显示窗口。
使用校验器可以有效地限制用户的输入,避免非法输入导致程序崩溃或产生错误结果。同时,QFormLayout表单布局也可以方便地组织控件,使界面更加美观和易用。
3-4-7、QLineEdit综合案例
下面是一个使用QLineEdit控件的综合案例,包含以下内容:
创建一个主窗口,并在窗口中放置一个QLineEdit控件和一个按钮;
限制QLineEdit控件的输入为浮点数,并设置默认值;
点击按钮时,获取QLineEdit控件中的值,并进行简单的计算,并将结果显示在消息框中。
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QLineEdit, QPushButton, QMessageBox, QVBoxLayout, QWidget
from PyQt5.QtGui import QDoubleValidator
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 创建QLabel控件和QLineEdit控件
self.label = QLabel('Enter a number:', self)
self.lineedit = QLineEdit(self)
# 设置默认值和浮点数校验器
self.lineedit.setText('0.0')
validator = QDoubleValidator()
self.lineedit.setValidator(validator)
# 创建QPushButton控件
self.button = QPushButton('Calculate', self)
self.button.setToolTip('Click to calculate the square of the input value')
self.button.clicked.connect(self.calculate)
# 设置控件布局
vbox = QVBoxLayout()
vbox.addWidget(self.label)
vbox.addWidget(self.lineedit)
vbox.addWidget(self.button)
widget = QWidget()
widget.setLayout(vbox)
self.setCentralWidget(widget)
# 设置窗口属性
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('QLineEdit Example')
self.show()
def calculate(self):
# 获取QLineEdit控件中的值
value = self.lineedit.text()
# 如果值为空,则弹出警告框
if not value:
QMessageBox.warning(self, 'Warning', 'Please enter a number.')
return
# 进行计算,并显示结果
try:
result = float(value) ** 2
QMessageBox.information(self, 'Result', f'The square of {value} is {result}.')
except ValueError:
QMessageBox.warning(self, 'Warning', 'Please enter a valid number.')
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
输出界面如下:
在这个例子中,我们创建了一个主窗口,并在窗口中放置了一个QLineEdit控件和一个按钮。我们使用QDoubleValidator校验器来限制QLineEdit控件的输入为浮点数,并设置了默认值为0.0。在点击按钮时,我们获取QLineEdit控件中的值,并进行简单的计算,并将结果显示在消息框中。
如果输入的值为空,我们会弹出一个警告框提示用户输入一个数字;如果输入的不是数字,我们也会弹出一个警告框提示用户输入一个有效的数字。
3-5、添加伙伴关系Qlabel、QLineEdit
在Qt Designer中,添加伙伴关系可以使得某些控件与标签或其他控件关联起来,从而使得用户输入更加方便和明确。以下是添加伙伴关系的步骤:
打开Qt Designer并加载您的UI文件。
从左侧的工具栏中选择“标签”(QLabel)或“行编辑器”(QLineEdit)控件,然后将其拖放到您想要添加伙伴关系的控件旁边。
选中要与标签或行编辑器关联的控件。可以在属性编辑器中选择“伙伴”属性。
单击“伙伴”属性旁边的“…”按钮,然后选择要添加为伙伴的标签或行编辑器。
保存您的UI文件并重新加载应用程序以查看效果。
添加伙伴关系后,用户可以使用标签或行编辑器轻松地标识与控件关联的文本或标签,并且可以通过快捷键或键盘导航更轻松地访问控件。
具体步骤:
在Qlabel后加上(&B)。
将QLabel与后边的文本输入框添加伙伴关系
之后保存,即可使用alt+B访问到文本框
代码示例:
可以使用setBuddy()方法来将一个QLabel控件和一个QLineEdit控件绑定成伙伴关系。这样在用户按下Alt键并激活QLabel控件时,可以将焦点自动转移到与之关联的QLineEdit控件中。
下面是一个简单的例子,演示如何将一个QLabel控件和一个QLineEdit控件绑定成伙伴关系,并将它们添加到一个QGridLayout布局中:
import sys
from PyQt5.QtWidgets import QApplication, QLabel, QLineEdit, QGridLayout, QWidget
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 创建QLabel和QLineEdit控件,并将它们绑定成伙伴关系
nameLabel = QLabel('Name:')
nameEdit = QLineEdit()
nameLabel.setBuddy(nameEdit)
ageLabel = QLabel('Age:')
ageEdit = QLineEdit()
ageLabel.setBuddy(ageEdit)
# 创建QGridLayout布局,并将控件添加到其中
grid = QGridLayout()
grid.addWidget(nameLabel, 0, 0)
grid.addWidget(nameEdit, 0, 1)
grid.addWidget(ageLabel, 1, 0)
grid.addWidget(ageEdit, 1, 1)
# 设置窗口布局和大小
self.setLayout(grid)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Buddy Example')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
如下图所示:
在这个例子中,我们创建了两个QLabel控件和两个QLineEdit控件,并将它们绑定成了伙伴关系。然后我们创建了一个QGridLayout布局,并将这些控件添加到布局中。最后,我们将布局设置为窗口的布局,并显示窗口。
3-6、QTextEdit介绍
3-6-1、QTextEdit简单介绍
QTextEdit是一个可以用于显示和编辑富文本的多行文本编辑控件。它可以用于创建编辑器、日记、HTML文本查看器等。
QTextEdit可以在文本中插入多媒体内容,如图像、超链接、HTML表格等,并且可以在文本中使用样式来设置字体、颜色、背景、对齐等。QTextEdit还支持拼写检查、撤销/重做、自动缩进、文本选择等基本编辑功能。
下面是一个简单的使用QTextEdit的例子:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QTextEdit, QFileDialog
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 创建QTextEdit控件
self.textedit = QTextEdit(self)
self.setCentralWidget(self.textedit)
# 创建菜单栏
menubar = self.menuBar()
# 创建文件菜单
filemenu = menubar.addMenu('File')
# 创建“打开”操作
openact = QAction(QIcon('open.png'), 'Open', self)
openact.setShortcut('Ctrl+O')
openact.triggered.connect(self.openFile)
filemenu.addAction(openact)
# 创建“保存”操作
saveact = QAction(QIcon('save.png'), 'Save', self)
saveact.setShortcut('Ctrl+S')
saveact.triggered.connect(self.saveFile)
filemenu.addAction(saveact)
# 设置窗口属性
self.setGeometry(300, 300, 350, 250)
self.setWindowTitle('QTextEdit Example')
self.show()
def openFile(self):
# 打开文件对话框
filename = QFileDialog.getOpenFileName(self, 'Open File')[0]
# 如果选择了文件,则读取文件内容到QTextEdit控件中
if filename:
with open(filename, 'r') as f:
text = f.read()
self.textedit.setText(text)
def saveFile(self):
# 打开文件对话框
filename = QFileDialog.getSaveFileName(self, 'Save File')[0]
# 如果选择了文件,则将QTextEdit控件中的内容保存到文件中
if filename:
with open(filename, 'w') as f:
f.write(self.textedit.toPlainText())
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
输出界面如下图所示:
在这个例子中,我们创建了一个主窗口,并在窗口中放置了一个QTextEdit控件。我们使用菜单栏来创建“打开”和“保存”操作,当用户点击对应的菜单项时,我们会打开文件对话框,让用户选择要打开或保存的文件。如果选择了文件,则会读取文件内容到QTextEdit控件中,或将QTextEdit控件中的内容保存到文件中。
3-6-2、QTextEdit综合案例
以下是一个更综合的使用QTextEdit的例子,实现了一个简单的文本编辑器,并包括了多个功能:
打开、保存文件
新建文件
剪切、复制、粘贴、撤销、重做
设置字体、颜色、对齐方式
显示当前文档中的字数和行数
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QTextEdit, QFileDialog, QFontDialog, QColorDialog
from PyQt5.QtGui import QIcon, QTextCursor, QTextCharFormat
from PyQt5.QtCore import Qt
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 创建QTextEdit控件
self.textedit = QTextEdit(self)
self.setCentralWidget(self.textedit)
# 创建菜单栏
menubar = self.menuBar()
# 创建文件菜单
filemenu = menubar.addMenu('File')
# 创建“新建”操作
newact = QAction(QIcon('new.png'), 'New', self)
newact.setShortcut('Ctrl+N')
newact.triggered.connect(self.newFile)
filemenu.addAction(newact)
# 创建“打开”操作
openact = QAction(QIcon('open.png'), 'Open', self)
openact.setShortcut('Ctrl+O')
openact.triggered.connect(self.openFile)
filemenu.addAction(openact)
# 创建“保存”操作
saveact = QAction(QIcon('save.png'), 'Save', self)
saveact.setShortcut('Ctrl+S')
saveact.triggered.connect(self.saveFile)
filemenu.addAction(saveact)
# 创建编辑菜单
editmenu = menubar.addMenu('Edit')
# 创建“剪切”操作
cutact = QAction(QIcon('cut.png'), 'Cut', self)
cutact.setShortcut('Ctrl+X')
cutact.triggered.connect(self.textedit.cut)
editmenu.addAction(cutact)
# 创建“复制”操作
copyact = QAction(QIcon('copy.png'), 'Copy', self)
copyact.setShortcut('Ctrl+C')
copyact.triggered.connect(self.textedit.copy)
editmenu.addAction(copyact)
# 创建“粘贴”操作
pasteact = QAction(QIcon('paste.png'), 'Paste', self)
pasteact.setShortcut('Ctrl+V')
pasteact.triggered.connect(self.textedit.paste)
editmenu.addAction(pasteact)
# 创建“撤销”操作
undoact = QAction(QIcon('undo.png'), 'Undo', self)
undoact.setShortcut('Ctrl+Z')
undoact.triggered.connect(self.textedit.undo)
editmenu.addAction(undoact)
# 创建“重做”操作
redoact = QAction(QIcon('redo.png'), 'Redo', self)
redoact.setShortcut('Ctrl+Y')
redoact.triggered.connect(self.textedit.redo)
editmenu.addAction(redoact)
# 创建格式菜单
formatmenu = menubar.addMenu('Format')
# 创建“字体”操作
fontact = QAction(QIcon('font.png'), 'Font', self)
fontact.setShortcut('Ctrl+F')
fontact.triggered.connect(self.setFont)
formatmenu.addAction(fontact)
# 创建“颜色”
coloract = QAction(QIcon('color.png'), 'Color', self)
coloract.setShortcut('Ctrl+Shift+C')
coloract.triggered.connect(self.setColor)
formatmenu.addAction(coloract)
# 创建“左对齐”操作
leftact = QAction(QIcon('left.png'), 'Align Left', self)
leftact.setShortcut('Ctrl+L')
leftact.triggered.connect(lambda: self.setAlignment(Qt.AlignLeft))
formatmenu.addAction(leftact)
# 创建“居中对齐”操作
centeract = QAction(QIcon('center.png'), 'Align Center', self)
centeract.setShortcut('Ctrl+E')
centeract.triggered.connect(lambda: self.setAlignment(Qt.AlignCenter))
formatmenu.addAction(centeract)
# 创建“右对齐”操作
rightact = QAction(QIcon('right.png'), 'Align Right', self)
rightact.setShortcut('Ctrl+R')
rightact.triggered.connect(lambda: self.setAlignment(Qt.AlignRight))
formatmenu.addAction(rightact)
# 创建状态栏,显示行数和字数
self.statusBar().showMessage('Lines: 1, Words: 0')
self.textedit.textChanged.connect(self.updateStatus)
self.setGeometry(300, 300, 800, 600)
self.setWindowTitle('Text Editor')
self.show()
def newFile(self):
# 新建文件
self.textedit.clear()
def openFile(self):
# 打开文件
filename, _ = QFileDialog.getOpenFileName(self, 'Open File', '', 'Text Files (*.txt);;All Files (*)')
if filename:
with open(filename, 'r') as f:
self.textedit.setText(f.read())
def saveFile(self):
# 保存文件
filename, _ = QFileDialog.getSaveFileName(self, 'Save File', '', 'Text Files (*.txt);;All Files (*)')
if filename:
with open(filename, 'w') as f:
f.write(self.textedit.toPlainText())
def setFont(self):
# 设置字体
font, ok = QFontDialog.getFont(self.textedit.currentFont(), self)
if ok:
self.textedit.setCurrentFont(font)
def setColor(self):
# 设置颜色
color = QColorDialog.getColor(self.textedit.textColor(), self)
if color.isValid():
self.textedit.setTextColor(color)
def setAlignment(self, alignment):
# 设置对齐方式
self.textedit.setAlignment(alignment)
def updateStatus(self):
# 更新状态栏
cursor = self.textedit.textCursor()
lines = self.textedit.toPlainText().count('
') + 1
words = len(self.textedit.toPlainText().split())
self.statusBar().showMessage(f'Lines: {lines}, Words: {words}')
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
生成界面如下: