PyQt5: en un QMainMenu, ¿cómo hacer que un QWidget sea el padre (temporalmente)?
Tengo unQMainWindow
que inicializo con unaQWidget
. Quiero que cada vez que presione el botónNew
En miQMainWiindow
, abrirá laQWidget
temporalmente (en mi caso, hasta que se suelte el botón del mouse).
Tengo problemas para interactuarQMainWindow
con elQWidget
. Probé muchas opciones, pero parecía que todo lo que intentaba ataba elQWidget
alQMainWindow
screen, y no quiero eso.
Será más fácil con un ejemplo:
TempWidgetMenu.py
es miQMainWindow
clase. Cuando presionoNew
, unaQWidget
parecerá @, coloreará la pantalla de gris a gris y coloreará un rectángulo desde la presión de un botón hasta la liberación del botón (como en la herramienta de recorte de Windows).
Quiero eso cada vez que presionoNew
, Podré dibujar un rectángulo desde cada punto de la pantalla, y así lo hace la primera vez. Cuando presionoNew
por segunda vez (o después), coloreará todo menos la pantalla del menú principal y no responderá a las acciones del botón.
Quiero que el widget sea el "padre" del programa en la pantalla cada vez que presione el botón.
TempWidgetMenu.py (principal)
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QAction
from PyQt5.QtGui import QPixmap, QPainter
import TempWidget
class Menu(QMainWindow):
def __init__(self):
super().__init__()
newAct = QAction('New', self)
newAct.triggered.connect(self.new_image_window)
self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(newAct)
self.opac_rect = TempWidget.TempOpacWidget()
self.image = QPixmap("background.png")
self.setGeometry(100, 100, 500, 300)
self.resize(self.image.width(), self.image.height())
self.show()
def new_image_window(self):
self.opac_rect.start()
def paintEvent(self, event):
painter = QPainter(self)
painter.drawPixmap(self.rect(), self.image)
if __name__ == '__main__':
app = QApplication(sys.argv)
mainMenu = Menu()
sys.exit(app.exec_())
TempWidget.py :
import tkinter as tk
from PyQt5 import QtWidgets, QtCore, QtGui
class TempOpacWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
root = tk.Tk()
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
self.setGeometry(0, 0, screen_width, screen_height)
self.setWindowTitle(' ')
self.begin = QtCore.QPoint()
self.end = QtCore.QPoint()
self.busy = False
def start(self):
self.busy = True
self.setWindowOpacity(0.3)
self.show()
def paintEvent(self, event):
if self.busy:
brush_color = (128, 128, 255, 100)
opacity = 0.3
else:
brush_color = (0, 0, 0, 0)
opacity = 0
self.setWindowOpacity(opacity)
qp = QtGui.QPainter(self)
qp.setBrush(QtGui.QColor(*brush_color))
qp.drawRect(QtCore.QRectF(self.begin, self.end))
def mousePressEvent(self, event):
self.begin = event.pos()
self.end = self.begin
self.update()
def mouseMoveEvent(self, event):
self.end = event.pos()
self.update()
def mouseReleaseEvent(self, event):
self.busy = False
self.repaint()
Me doy cuenta de que estoy inicializando elTempOpacWidget
una vez al comienzo. Quiero inicializarlo solo una vez, porque está haciendo lo mismo.
¿Cómo puedo solucionarlo, de modo que elTempOpacWidget
será el padre cada vez que lo llame?
Edit: Si algo no está claro, ejecute el código, tendrá mucho sentido. PrensaNew
, Elija un rectángulo (con el mouse) y luego presioneNew
nuevamente para elegir otro rectángulo, y comprenderá cuál es el problema.