在《PyQt(Python+Qt)学习随笔:QScrollArea滚动区域详解》介绍了滚动区域的展示层(也称框架层)和内容部署层:html
因为内容部署层在程序运行时与展示层没有明确的可视界限,本文将在滚动区域上将内容部署层的范围使用红色边框的矩形绘制出来,以实时了解内容部署层的大小。python
整个程序界面设计以下:
在上述界面中:web
要在ui界面上的某部件A上画矩形,必须经过部件A的Paint消息处理中进行,这就须要截获部件A的paint消息。 关于消息捕获请参考《第15.17节 PyQt(Python+Qt)入门学习:PyQt图形界面应用程序的事件捕获方法大全及对比分析》。编程
因为不想对UI界面的部件类进行子类化,所以消息捕获使用的是事件过滤方法;框架
在捕获消息前先定义了消息监视类,用于监视scrollAreaWidgetContents的消息,类定义代码以下:svg
class eventMonitor(QtCore.QObject): def eventFilter(self, objwatched, event): eventType = event.type() flag = eventType == QtCore.QEvent.Paint if flag: self.mypaintEvent(objwatched) ret = False else: ret = super().eventFilter(objwatched, event) return ret
上述代码截获了objwatched对象的消息,并判断是否是Paint消息,若是是则调用方法mypaintEvent在objwatched的几何矩形范围的边框画一个矩形,不然直接将消息往上传递。学习
def mypaintEvent(self, parent): paint = QtGui.QPainter(parent) #在对应部件上建立画笔 ...... paint.drawRect(geometry) #画对应大小的矩形
class mainWin(ui_mainWin_scrollArea.Ui_mainWin,QtWidgets.QWidget): def __init__(self): super().__init__() self.setupUi(self) for i in range(100): #将label设置为增长了带0-99数字(空格分隔)的长文本 self.label.setText(self.label.text()+str(i)+' ') self.scrollAreaInitSize = self.scrollArea.widget().size() #记下滚动区域部件内容部署层的初始大小
monitorObj = eventMonitor() # 建立事件刷选监视对象 w.scrollArea.widget().installEventFilter(monitorObj) # 对滚动区域内置展示层部件安装事件刷选
注意:在这里是在应用主程序代码安装的事件刷选,其实也能够在界面类内去安装事件刷选,不过安装时必须使用self.monitorObj来保存监视对象,不然方法一结束监视对象就会自动销毁。测试
老猿关于PyQt的付费专栏《使用PyQt开发图形界面Python应用》只须要9.9元,该部分与第十五章的内容基本对应,但一样内容在付费专栏上整体来讲更详细、案例更多。本节内容对应付费专栏的《PyQt编程实战:画出QScrollArea的scrollAreaWidgetContents内容部署层的范围矩形》。若是有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。ui