2015-11-29 18 views
6

मैं semitransparent पृष्ठभूमि के साथ एक पूर्णस्क्रीन विंडो बनाना चाहता हूं, लेकिन पूरी तरह से दिखाई देने वाले बच्चों के विजेट (ओवरले प्रभाव की तरह)।PyQt5: गैर-पारदर्शी बच्चों के साथ अर्ध-पारदर्शी विंडो बनाएं

यहाँ मैं अब तक है:

import sys 

from PyQt5.QtCore import * 
from PyQt5.QtGui import * 
from PyQt5.QtWidgets import * 

app = QApplication(sys.argv) 

# Create the main window 
window = QMainWindow() 

window.setWindowOpacity(0.3) 
window.setAttribute(Qt.WA_NoSystemBackground, True) 
window.setWindowFlags(Qt.FramelessWindowHint) 

# Create the button 
pushButton = QPushButton(window) 
pushButton.setGeometry(QRect(240, 190, 90, 31)) 
pushButton.setText("Finished") 
pushButton.clicked.connect(app.quit) 

# Center the button 
qr = pushButton.frameGeometry() 
cp = QDesktopWidget().availableGeometry().center() 
qr.moveCenter(cp) 
pushButton.move(qr.topLeft()) 

# Run the application 
window.showFullScreen() 
sys.exit(app.exec_()) 

यह एक अर्द्ध पारदर्शी प्रभाव पैदा करता है, लेकिन फिर भी बटन अर्द्ध पारदर्शी है।

मैं भी इस कॉल

window.setAttribute(Qt.WA_TranslucentBackground, True) 

साथ लेकिन कोई लाभ नहीं हुआ

window.setWindowOpacity(0.3) 

स्थानापन्न करने की कोशिश की इस मामले पृष्ठभूमि था में पूरी तरह से पारदर्शी (जबकि बटन ठीक से पूरी तरह से दिखाई दे रही थी)।

समाधान: (हारून के सुझाव को लागू किया धन्यवाद):

चाल मुख्य विंडो के लिए एक कस्टम paintEvent को लागू करने में है।

import sys 

from PyQt5.QtCore import * 
from PyQt5.QtGui import * 
from PyQt5.QtWidgets import * 

class CustomWindow(QMainWindow): 
    def paintEvent(self, event=None): 
     painter = QPainter(self) 

     painter.setOpacity(0.7) 
     painter.setBrush(Qt.white) 
     painter.setPen(QPen(Qt.white)) 
     painter.drawRect(self.rect()) 


app = QApplication(sys.argv) 

# Create the main window 
window = CustomWindow() 

window.setWindowFlags(Qt.FramelessWindowHint) 
window.setAttribute(Qt.WA_NoSystemBackground, True) 
window.setAttribute(Qt.WA_TranslucentBackground, True) 

# Create the button 
pushButton = QPushButton(window) 
pushButton.setGeometry(QRect(240, 190, 90, 31)) 
pushButton.setText("Finished") 
pushButton.clicked.connect(app.quit) 

# Center the button 
qr = pushButton.frameGeometry() 
cp = QDesktopWidget().availableGeometry().center() 
qr.moveCenter(cp) 
pushButton.move(qr.topLeft()) 

# Run the application 
window.showFullScreen() 
sys.exit(app.exec_()) 

उत्तर

4

ठीक है, जबकि उपलब्ध झंडे के साथ काम करने के लिए आप अभी भी Qt.WA_TranslucentBackground उपयोग कर सकते हैं, क्योंकि यह है कि पारदर्शिता पर एक semitranparent रेक्ट आकर्षित करने के लिए संभव है नहीं लगता है।

QMainWindow से अपना मुख्य विन्डो प्राप्त करें और इसके बजाय उस वर्ग का उपयोग करें।

उस वर्ग

करने के लिए self.setAttribute(Qt.WA_TranslucentBackground, True) लागू इस तरह से अपनी MainWindow वर्ग के paintEvent लागू (समान, त्रुटियां हो सकती है, लेकिन सिद्धांत काम करना चाहिए):

कि
QPixmap canvas(rect()) 

canvas.fill(Qt.transparent) # fill transparent (makes alpha channel available) 

QPainter p(canvas)   # draw on the canvas 
p.setOpacity(0.3) 
p.setBrush(QBrush(Qt.white)) # use the color you like 
p.setPen(QPen(Qt.transparen)) 

p.drawRect(rect()) # draws the canvas with desired opacity 

p.start(self)  # now draw on the window itself 
p.drawPixmap(rect(), canvas) 
+0

क्या होता है बटन अब भी है अर्द्ध पारदर्शी, और पृष्ठभूमि एक सिस्टम परिभाषित रंग सेट करता है (काला के बजाय, यह अब सफेद है)। मुझे यकीन नहीं है कि setWindowOpacity गैर-विंडो विजेट पर काम करता है। – Enuy

+0

मेरा जवाब संपादित किया गया। मैंने इसे कभी-कभी ऐसा किया और यह हमेशा काम करता है क्योंकि आपको इसकी आवश्यकता होती है। – Aaron

+0

ठीक है, मैं इस क्यूटी छद्म कोड को पीईक्यूटी में बदलने की कोशिश करूंगा और देख सकता हूं कि यह कैसे काम करता है। – Enuy

संबंधित मुद्दे