Это очень важно. Я обновил свой код. Нажмите 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 Снова выберите другой прямоугольник, и вы поймете, в чем проблема.

Ответы на вопрос(1)

Ваш ответ на вопрос