TransWikia.com

PyQt5: Как создать окно с прозрачным фоном

Stack Overflow на русском Asked by Electroplayer on November 7, 2021

Нужно окно, у которого будут видны элементы управления винды (закрыть, развернуть, свернуть) и чтобы можно было изменять размер, но при этом, чтобы фон был полностью прозрачен. Если установить кнопку, то она должна быть видна и кликабельная.

PyQt5 открыл для себя несколько дней назад и вообще ни в чём не шарю. Если не будет трудно, объясните, что там происходит.

Заранее благодарен.

UPD:
Пример кода:

index.py:

from PyQt5 import QtWidgets, QtGui, QtCore
from des import Ui_MainWindow
import sys

class mywindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(mywindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

app = QtWidgets.QApplication([])
application = mywindow()
application.show()
sys.exit(app.exec())

des.py:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(474, 391)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 474, 20))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

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

One Answer

Как для начала вы выбрали не самую простую задачу.

Попробуйте изучить один из самых простых вариантов как это можно сделать. Если после изучения у вас будут вопросы, задайте их, постараюсь ответить.

import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.Qt import *


class Widget(QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        
        self.title = QLabel('<h1 style="color: red;">Title Bar</h1>' ) 
        self.title.setAlignment(Qt.AlignCenter)
        
        btn_size = 35
        self.btn_close = QPushButton("x")
        self.btn_close.setFixedSize(btn_size, btn_size)
        self.btn_close.setStyleSheet("background-color: red;")
        self.btn_min = QPushButton("_")
        self.btn_min.setFixedSize(btn_size, btn_size)
        self.btn_min.setStyleSheet("background-color: gray;")
        self.btn_max = QPushButton("+")
        self.btn_max.setFixedSize(btn_size, btn_size)
        self.btn_max.setStyleSheet("background-color: gray;")

        self.line = QFrame(self)
        self.line.setStyleSheet("border: 3px solid rgb(255, 205, 0);")
        self.line.setFrameShape(QtWidgets.QFrame.HLine)
        
        title_bar = QHBoxLayout()
        title_bar.setContentsMargins(0, 0, 0, 0)        
        title_bar.addWidget(self.title)
        title_bar.addWidget(self.btn_min)
        title_bar.addWidget(self.btn_max)
        title_bar.addWidget(self.btn_close)

        main_layout = QVBoxLayout(self)   
        main_layout.setContentsMargins(0, 0, 0, 0)        
        main_layout.addLayout(title_bar)
        main_layout.addWidget(self.line)   
        main_layout.addStretch()                                   
        self.setWindowFlags(Qt.FramelessWindowHint)


class MainWindow(QMainWindow):  # QMainWindow  -QWidget
    def __init__(self):
        super(MainWindow, self).__init__()
        self.centralwidget = QWidget()
        self.setCentralWidget(self.centralwidget)
        
        self.widget = Widget(self)
        self.widget.btn_close.clicked.connect(self.btn_close_clicked)
        self.widget.btn_min.clicked.connect(self.btn_min_clicked)
        self.widget.btn_max.clicked.connect(self.btn_max_clicked)
        
        lbl = QLabel('Hello World !!', self, alignment=Qt.AlignHCenter | Qt.AlignTop)
        lbl.setStyleSheet("""
            QLabel {
                font-family: 'Consolas'; 
                color: red; 
                font-size: 55px;
            }
        """)
        
        self.setAttribute(Qt.WA_TranslucentBackground, True )   
        self.setAttribute(Qt.WA_NoSystemBackground, False)      
        self.setWindowFlags(Qt.FramelessWindowHint)
        self.setStyleSheet("""
            MainWindow {
                background-color: rgba(0, 215, 55,    0);
/*  попробуйте заменить строку выше на:              v^ <---
                background-color: rgba(0, 215, 55,   70);
*/                
                border: 3px solid rgb(255, 205, 0);
            }
        """) 

        self.button = QPushButton("Quit", self)
        self.button.setAutoFillBackground(False)
        self.button.setStyleSheet("""
            background-color: qlineargradient(spread:pad, 
                              x1:0.988818, y1:0.915, 
                              x2:0, y2:0, 
                              stop:0 rgba(53, 129, 90, 255), 
                              stop:1 rgba(255, 255, 255, 255));
            font: 75 16pt "Georgia";
        """)
        
        self.button.setFixedSize(100, 100)
        self.button.clicked.connect(self.close)
        
        layout = QVBoxLayout(self.centralwidget)
        layout.addWidget(self.widget)
        layout.addWidget(lbl)
        layout.addStretch()
        layout.addWidget(self.button, alignment=Qt.AlignCenter)
        
    def btn_close_clicked(self):
        quit()

    def btn_min_clicked(self):
        self.showMinimized() 

    def btn_max_clicked(self):
        if self.isMaximized():
            self.showNormal()
            self.widget.btn_max.setText('+')
        else:
            self.showMaximized()
            self.widget.btn_max.setText('R')

    def mousePressEvent(self, event):
        self.old_Pos = event.globalPos()
        self.old_width = self.width()
        self.old_height = self.height()
        
    def mouseMoveEvent(self, event):
        if (event.buttons() == Qt.LeftButton):                
            delta = QPoint (event.globalPos() - self.old_Pos)
            if (self.old_Pos.x() > self.x() + self.old_width - 10) or 
               (self.old_Pos.y() > self.y() + self.old_height - 10):
                w = self.old_width+delta.x()  if self.old_width+delta.x()  > 230 else 230
                h = self.old_height+delta.y() if self.old_height+delta.y() >  85 else  85 
                self.setFixedSize(w, h)                   
            else:
                self.move(self.x() + delta.x(), self.y() + delta.y())
                self.old_Pos = event.globalPos()
            

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    w.resize(600, 400)
    w.show()
    sys.exit(app.exec())

введите сюда описание изображения

Answered by S. Nick on November 7, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP