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"))
Как для начала вы выбрали не самую простую задачу.
Попробуйте изучить один из самых простых вариантов как это можно сделать. Если после изучения у вас будут вопросы, задайте их, постараюсь ответить.
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP