Search code examples
pythonpython-3.xpyqtpyqt4

PyQt5: Create transparent window with opaque widgets


Is it possible to make mainWindow completely transparent while other widgets remains visible?

For example:

I want to make app transparent and make everything else visible (like, mainFrame, close button, minimize button)


Solution

  • As @Felipe mentioned you can use window.setAttribute(QtCore.Qt.WA_TranslucentBackground) here is a little example:

    import sys
    from PyQt5 import QtWidgets, QtCore
    
    app = QtWidgets.QApplication(sys.argv)
    
    # create invisble widget
    window = QtWidgets.QWidget()
    window.setAttribute(QtCore.Qt.WA_TranslucentBackground)
    window.setWindowFlags(QtCore.Qt.FramelessWindowHint)
    window.setFixedSize(800, 600)
    
    # add visible child widget, when this widget is transparent it will also be invisible
    visible_child = QtWidgets.QWidget(window)
    visible_child.setStyleSheet('QWidget{background-color: white}')
    visible_child.setObjectName('vc')
    visible_child.setFixedSize(800, 600)
    layout = QtWidgets.QGridLayout()
    
    # add a close button
    close_button = QtWidgets.QPushButton()
    close_button.setText('close window')
    close_button.clicked.connect(lambda: app.exit(0))
    layout.addWidget(close_button)
    
    # add a button that makes the visible child widget transparent
    change_size_button = QtWidgets.QPushButton()
    change_size_button.setText('change size')
    change_size_button.clicked.connect(lambda: visible_child.setStyleSheet('QWidget#vc{background-color: transparent}'))
    layout.addWidget(change_size_button)
    
    visible_child.setLayout(layout)
    window.show()
    app.exec()