[英]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.