PyQt5设置Mainwindow背景透明

时间:2017-11-10 12:49:24

标签: python-3.x qt pyqt5 transparent qmainwindow

我试图通过使用下面部分透明的PNG使我的应用的顶部边框半透明(圆边):

a busy cat

这不起作用,最终在应用程序启动时填充了角落。简化代码如下:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.setEnabled(True)
        MainWindow.resize(819, 682)
        MainWindow.setMinimumSize(QtCore.QSize(819, 682))
        MainWindow.setMaximumSize(QtCore.QSize(819, 682))
        MainWindow.setWindowOpacity(1.0)
        MainWindow.setAttribute(QtCore.Qt.WA_TranslucentBackground)
        self.centralWidget = QtWidgets.QWidget(MainWindow)
        self.centralWidget.setObjectName("centralWidget")
        self.TopBarFrame = QtWidgets.QFrame(self.centralWidget)
        self.TopBarFrame.setGeometry(QtCore.QRect(-1, -1, 821, 31))
        self.TopBarFrame.setStyleSheet("background-image:url(\"TopBar.png\")")
        self.TopBarFrame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.TopBarFrame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.TopBarFrame.setObjectName("TopBarFrame")
        MainWindow.setCentralWidget(self.centralWidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

仅使用.setAttribute(QtCore.Qt.WA_TranslucentBackground)会使整个窗口变黑。所有帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

为什么使用MainWindow.setWindowOpacity(1.0)?这会完全改变窗口以及所有小部件的不透明度(透明度)。如果您想使用圆角,则不要使用任何图像,只需编写border-radius:10px;(例如)做同样的事情。 如果您将窗口设置为无边框(无边框),则MainWindow.setAttribute(QtCore.Qt.WA_TranslucentBackground)可以正常工作,否则只会出现黑屏。对代码进行一些修改后,这就是最终结果

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.setEnabled(True)
        MainWindow.resize(819, 682)
        MainWindow.setMinimumSize(QtCore.QSize(819, 682))
        MainWindow.setMaximumSize(QtCore.QSize(819, 682))
        MainWindow.setWindowFlags(
                    QtCore.Qt.FramelessWindowHint 
                  | QtCore.Qt.WindowStaysOnTopHint )
        MainWindow.setAttribute(QtCore.Qt.WA_TranslucentBackground)
        self.centralWidget = QtWidgets.QWidget(MainWindow)
        self.centralWidget.setObjectName("centralWidget")
        self.TopBarFrame = QtWidgets.QFrame(self.centralWidget)
        self.TopBarFrame.setGeometry(QtCore.QRect(-1, -1, 821, 31))
        self.TopBarFrame.setStyleSheet('''background:red;
        border-top-left-radius:15px;
        border-top-right-radius:15px;''')
        self.TopBarFrame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.TopBarFrame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.TopBarFrame.setObjectName("TopBarFrame")
        MainWindow.setCentralWidget(self.centralWidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

如果您有任何问题,请告诉我。