0%

PyQt5基本窗口控件(一)

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_())

4-1.png

主窗口居中

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类。

  • 窗口:没有嵌入到其他控件中的控件称为窗口
  • 控件:按钮、复选框、文本框、表格、进度条
    Qt4-8.png
  • QWidget提供的成员函数:x(),y()获得窗口左上角的坐标,width(),height()获得客户去的宽度和高度。
  • QWidget.geometry()类提供成员函数:x(),y()获得客户去左上角坐标,width(),height()获得客户区的宽度和高度。
  • QWidget.frameGeometry()提供的成员函数:x(),y()获得窗口左上角的坐标,width(),height()获取包含客户区、标题栏和边框在内的整个窗口的宽度和高度

常用的几何结构

不包含边框

  1. 客户区面积
    1
    2
    QWidget.resize(width, height)
    QWidget.resiez(QSize)
    此时可以用鼠标来调整窗口大小
  2. 客户区大小
    1
    QWidget.size()
  3. 获取客户区域的宽度和高度
    1
    2
    QWiget.width()
    QWiget.height()
  4. 设置客户区的固定宽度和高度
    1
    2
    3
    4
    QWidget.setFixedWidth(int width)
    QWidget.setFixedHeigth(int height)
    QWidget.setFiexdSize(Qsize size)
    QWidget.setFiexdSize(int width, int height)
    此时不能通过鼠标调整窗口大小。
  5. 同时改变面积和位置

    1
    2
    QWidget.setGeometry(int x, int y, int width, int height);
    QWidget.setGeometry(Qrect rect)

    包含边框

  6. 获得窗口的大小和位置

    1
    QWidget.frameGeometry() -> Qrect
  7. 设置窗口的位置
    1
    2
    QWidget.move(int x, int y)
    QWidget.move(QPoint point)
  8. 获得窗口左上角的位置
    1
    QWidget.pos()

例子

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
# -*- coding: UTF-8 -*-
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")
# 设置标签1的内容,添加快捷键
nameLb1 = QLabel('&Name', self)
# 建立单行文本输入框
nameEd1 = QLineEdit(self)
# 标签与文本框绑定,按快捷键Alt+Q可以定位到单行输入框
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就可以快速定位到所绑定的伙伴控件上,后面的快捷键使用类似.