[英]PyQt5: QPainter overlay QWidget
对于这个问题,我指的是单击时来自QWidget上 @Kuba Ober Draw Rectangular overlay的答案
我的问题:我不知道如何将C ++(或C?)“翻译”成Python。 :-(
因此,我再次问这个“重复的”问题,希望有人能帮助重写代码以在PyQt5中实现覆盖效果。
例如,我在这里准备一些代码:
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class MyApp(QWidget):
def __init__(self):
super(MyApp, self).__init__()
self.initUI()
def initUI(self):
self.text = "hello world"
self.setGeometry(100, 100, 400, 300)
self.setWindowTitle('Draw Demo')
self.btn = QPushButton("Butten should be overlayed", self)
self.btn.setFixedSize(200, 200)
self.btn.move(40, 40)
self.show()
def paintEvent(self, event):
qp = QPainter()
qp.begin(self)
qp.setPen(QColor(Qt.red))
qp.setFont(QFont('Arial', 20))
qp.drawText(10, 50, "hello Python")
qp.setPen(QColor(Qt.blue))
qp.drawLine(10, 100, 100, 100)
qp.drawRect(10, 150, 150, 100)
qp.setPen(QColor(Qt.red))
qp.drawEllipse(100, 50, 100, 50)
# qp.drawPixmap(220, 10, QPixmap("python.jpg"))
qp.fillRect(200, 175, 150, 100, QBrush(Qt.SolidPattern))
qp.end()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyApp()
window.show()
sys.exit(app.exec_())
目标是:让Button显示在背景中(由QPainter覆盖),但对鼠标事件是透明的。 因此,即使QPainter覆盖了该按钮,我也可以单击它。
任何帮助将不胜感激!
如果我们知道两种语言之间的等效和不同之处,那么从C ++到Python的翻译就很简单:
overLay.py
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class OverLay(QWidget):
def __init__(self, *args, **kwargs):
QWidget.__init__(self, *args, **kwargs)
self.setAttribute(Qt.WA_NoSystemBackground)
self.setAttribute(Qt.WA_TransparentForMouseEvents)
def paintEvent(self, event):
painter = QPainter(self)
painter.fillRect(self.rect(), QColor(80, 80, 255, 128))
class Filter(QObject):
def __init__(self, *args, **kwargs):
QObject.__init__(self, *args, **kwargs)
self.m_overlay = None
self.m_overlayOn = None
def eventFilter(self, obj, event):
if not obj.isWidgetType():
return False
if event.type() == QEvent.MouseButtonPress:
if not self.m_overlay:
self.m_overlay = OverLay(obj.parentWidget())
self.m_overlay.setGeometry(obj.geometry())
self.m_overlayOn = obj
self.m_overlay.show()
elif event.type() == QEvent.Resize:
if self.m_overlay and self.m_overlayOn == obj:
self.m_overlay.setGeometry(obj.geometry())
return False
if __name__ == '__main__':
app = QApplication(sys.argv)
filt = Filter()
window = QWidget()
lay = QHBoxLayout(window)
for text in ( "Foo", "Bar", "Baz "):
label = QLabel(text)
lay.addWidget(label)
label.installEventFilter(filt)
window.setMinimumSize(300, 250)
window.show()
sys.exit(app.exec_())
了解您要在窗口小部件中执行的操作后,必须使用以下代码:
main.py
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from overlay import Filter
class MyApp(QWidget):
def __init__(self):
super(MyApp, self).__init__()
self.initUI()
def initUI(self):
self.text = "hello world"
self.setGeometry(100, 100, 400, 300)
self.setWindowTitle('Draw Demo')
self.btn = QPushButton("Butten should be overlayed", self)
self.btn.setFixedSize(200, 200)
self.btn.move(40, 40)
filt = Filter(self)
self.btn.installEventFilter(filt)
self.show()
[...]
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyApp()
window.show()
sys.exit(app.exec_())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.