Это очень важно. Я обновил свой код. Нажмите New, выберите прямоугольник, а затем снова нажмите New, и вы поймете, в чем проблема.
я естьQMainWindow
что я инициализирую сQWidget
, Я хочу, чтобы каждый раз я нажимал кнопкуNew
В моемQMainWiindow
, это откроетQWidget
временно (в моем случае, до отпускания кнопки мыши).
У меня проблемы с взаимодействиемQMainWindow
сQWidget
, Я пробовал много вариантов, но казалось, что все, что я пытался связатьQWidget
кQMainWindow
экран, и я не хочу этого.
Это будет проще с примером:
TempWidgetMenu.py
мойQMainWindow
класс. Когда я нажимаюNew
,QWidget
появится, он будет окрашивать экран в серый цвет, и будет окрашивать прямоугольник от нажатия кнопки, до отпускания кнопки (как в инструменте прокрутки окон).
Я хочу, чтобы это каждый раз, когда я нажимаю наNew
Я смогу нарисовать прямоугольник из любой точки экрана, и так будет с первого раза. Когда я нажимаюNew
во второй раз (или после), он будет окрашивать все, кроме экрана главного меню, и не будет реагировать на действия кнопки.
Я хочу, чтобы виджет был «родителем» программы на экране при каждом нажатии кнопки.
TempWidgetMenu.py (главный):
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()
Я понимаю, что я инициализируюTempOpacWidget
один раз в начале. Я хочу инициализировать его только один раз, потому что он делает то же самое.
Как я могу это исправить, так чтоTempOpacWidget
будет ли родитель каждый раз, когда я ему звоню?
Изменить: Если что-то не ясно, запустите код, это будет иметь смысл. НажмитеNew
Выберите прямоугольник (с помощью мыши) и нажмитеNew
Снова выберите другой прямоугольник, и вы поймете, в чем проблема.