首页 > 应用开发 > > python自制简易浏览器
python自制简易浏览器
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 设置窗口标题
self.setWindowTitle('My First App')
# 设置标签
label = QLabel('Welcome to Shiyanlou!')
# 设置标签显示在中央
label.setAlignment(Qt.AlignCenter)
self.setCentralWidget(label)
# 创建应用实例,通过 sys.argv 传入命令行参数
app = QApplication(sys.argv)
# 创建窗口实例
window = MainWindow()
# 显示窗口
window.show()
# 执行应用,进入事件循环
app.exec_()这里需要说明的是 Qt 的执行机制。 Qt 的程序通过创建 QApplication 类实例来调用 app.exec_ 方法进入事件循环。此时程序一直在循环监听各种事件并把它们放入消息队列中,在适当的时候从队列中取出处理。
2.3 信号与槽
Qt 中每种组件都有所谓的信号槽(slot)机制。可用来将信号与相应的处理函数进行连接绑定。
...
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.windowTitleChanged.connect(self._my_func)
...
# 自定义的信号处理函数
def _my_func(self, s='my_func', a=100):
dic = {'s': s, 'a': a}
print(dic)
...
app.exec_()以上主要只给出了部分新添加的代码,原有的代码统一使用 ... 略过。
这里将 QMainWindow 的信号 windowTitleChanged 与 _my_func 槽函数相绑定,当窗口标题被更改的信号发出的时候便会触发函数 _my_func 进行处理。
其中在自定义函数 _my_func 中允许设置任意多个参数。
运行上方程序。
根据打印出来的字典键值可以发现 windowTitleChanged信号在被触发的时候向处理函数 _my_func 传递了一个参数也就是窗口标题。当然也有办法忽略这个值,就是采用 lamda 产生式。其原理就是通过 lamda 产生式的参数 x 捕获标题字符串,然后将 x 废弃不用,从而避免标题传入 _my_func。
修改如下:
...
self.windowTitleChanged.connect(lambda x: self._my_func('Shiyanlou', 666))
...运行结果。
为了更加直观地理解信号与槽,我们进一步修改代码,通过创建按钮响应按钮事件来展示信号与槽机制。
...
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 设置窗口标题
self.setWindowTitle('My First App')
# 添加布局
layout = QHBoxLayout()
# 创建按钮
for i in range(5):
button = QPushButton(str(i))
# 将按钮按压信号与自定义函数关联
button.pressed.connect(lambda x=i: self._my_func(x))
# 将按钮添加到布局中
layout.addWidget(button)
# 创建部件
widget = QWidget()
# 将布局添加到部件
widget.setLayout(layout)
# 将部件添加到主窗口上
self.setCentralWidget(widget)
# 自定义的信号处理函数
def _my_func(self, n):
print('click button %s' % n)
...另外 Qt 还支持自定义信号,可以通过创建 pyqtSignal对象实例来定义信号对象。
...
class MainWindow(QMainWindow):
# 自定义信号
my_signal = pyqtSignal(str)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 设置窗口标题
self.setWindowTitle('My First App')
button = QPushButton('Click me!')
button.pressed.connect(self._click_button)
# 将自定义信号与相应的槽函数连接
self.my_signal.connect(self._my_func)
# 将部件添加到主窗口上
self.setCentralWidget(button)
# 自定义的信号处理函数
def _click_button(self):
# 当按钮被点击的时候将发出信号 my_signal
self.my_signal.emit('shiyanlou')
def _my_func(self, s):
print(s)
...来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4822/viewspace-3140224/ ,如需转载,请注明出处,否则将追究法律责任。