Pyqt5 Безрамное окно для родителя и ребенка - PullRequest
0 голосов
/ 17 апреля 2020

в первый раз, используя stackoverflow. Я постараюсь написать свой вопрос как можно более ясным.

  1. Я создаю родительское окно первого окна второго окна (дочернее).

  2. Когда я нажимаю кнопку в первом окне, я хочу открыть второе окно.

  3. В окне я отправляю обратно некоторый текст в первое окно, используя метод .parent ()

  4. Я хочу, чтобы оба windows были безрамными, используя self.setWindowFlags (Qt.FramelessWindowHint)

Мой код:

from PyQt5.QtWidgets import QDialog, QApplication, QLineEdit, QPushButton
from PyQt5.QtCore import Qt, QRect
import sys

class FirstWindow(QDialog):
    def __init__(self, parent=None):

        super(FirstWindow, self).__init__(parent)

        self.setWindowFlags(Qt.FramelessWindowHint)

        self.setFixedSize(400,400)

        self.go_to_second_window = SecondWindow(self)

        ######################################################

        self.button_go_second_window = QPushButton(self)

        self.button_go_second_window.setGeometry(QRect(40,150,220,50))
        self.button_go_second_window.setStyleSheet("QPushButton { background-color: rgba(63, 142, 191, 255); color : rgba(242, 242, 242, 255) }")

        self.button_go_second_window.clicked.connect(self.go_second_window)  

        ###################################################### 

        self.show()

    def go_second_window (self):

        self.go_to_second_window.show()


class SecondWindow(QDialog):

    def __init__(self, parent):

        super(SecondWindow, self).__init__(parent)

        #self.setWindowFlags(Qt.FramelessWindowHint)

        self.setFixedSize(400,400)

        ######################################################
        self.field = QLineEdit(self)
        self.field.move(40,100)
        ######################################################

        self.button_send_data_back = QPushButton(self)
        self.button_send_data_back.setText("Send")
        self.button_send_data_back.setGeometry(QRect(40,150,220,50))
        self.button_send_data_back.setStyleSheet("QPushButton { background-color: rgba(63, 142, 191, 255); color : rgba(242, 242, 242, 255) }")

        self.button_send_data_back.clicked.connect(self.send_data_back)  



    def send_data_back (self):

        go_to_first_window = FirstWindow(self)
        self.parent().button_go_second_window.setText(self.field.text())
        self.field.setText("")

        go_to_first_window.show() 

        self.close()


if __name__ == "__main__" :
    App = QApplication (sys.argv)
    window = FirstWindow()
    sys.exit(App.exec())

Моя проблема:

Это работает именно так, как я ожидаю. Проблема в том, что второе окно не безрамное.

Если я раскомментирую #self.setWindowFlags(Qt.FramelessWindowHint) во втором окне инициализации, оно не будет работать так, как я ожидаю.

Если я раскомментирую его и установлю super(SecondWindow, self).__init__(parent) на super(SecondWindow, self).__init__(parent=None) у меня будут два windows без рамки, и они будут работать, как я ожидал, но я не смогу отправить свои данные обратно в Первое окно, так как метод .parent () не найдет родителя.

1 Ответ

1 голос
/ 17 апреля 2020

Почему вы используете parent (), чтобы получить объект из другого окна? Я подчеркиваю это, потому что вы заставляете второе окно быть дочерним по отношению ко второму окну, и это имеет вторичные последствия, подобные тому, который вы видите.

С другой стороны, каждый раз, когда вы делаете go_to_first_window = FirstWindow(self), вы создаем новое окно, поэтому в некоторых тестах у вас может быть много скрытых windows, которые излишне потребляют память.

В общем случае в Qt следует использовать сигналы для отправки информации другим элементам.

from PyQt5.QtWidgets import QDialog, QApplication, QLineEdit, QPushButton
from PyQt5.QtCore import Qt, QRect, pyqtSignal, pyqtSlot
import sys


class FirstWindow(QDialog):
    def __init__(self, parent=None):
        super(FirstWindow, self).__init__(parent)

        self.setWindowFlags(Qt.FramelessWindowHint)
        self.setFixedSize(400, 400)

        self.second_window = SecondWindow()

        self.button_go_second_window = QPushButton(self)
        self.button_go_second_window.setGeometry(QRect(40, 150, 220, 50))
        self.button_go_second_window.setStyleSheet(
            "QPushButton { background-color: rgba(63, 142, 191, 255); color : rgba(242, 242, 242, 255) }"
        )

        self.button_go_second_window.clicked.connect(self.go_second_window)
        self.second_window.sendDataSignal.connect(self.receive_data_slot)

    @pyqtSlot()
    def go_second_window(self):
        self.second_window.show()

    @pyqtSlot(str)
    def receive_data_slot(self, text):
        self.button_go_second_window.setText(text)


class SecondWindow(QDialog):
    sendDataSignal = pyqtSignal(str)

    def __init__(self, parent=None):

        super(SecondWindow, self).__init__(parent)
        self.setWindowFlags(Qt.FramelessWindowHint)
        self.setFixedSize(400, 400)

        self.field = QLineEdit(self)
        self.field.move(40, 100)
        self.button_send_data_back = QPushButton(self)
        self.button_send_data_back.setText("Send")
        self.button_send_data_back.setGeometry(QRect(40, 150, 220, 50))
        self.button_send_data_back.setStyleSheet(
            "QPushButton { background-color: rgba(63, 142, 191, 255); color : rgba(242, 242, 242, 255) }"
        )
        self.button_send_data_back.clicked.connect(self.send_data_back)

    @pyqtSlot()
    def send_data_back(self):
        self.sendDataSignal.emit(self.field.text())
        self.field.clear()
        self.close()


if __name__ == "__main__":
    App = QApplication(sys.argv)
    window = FirstWindow()
    window.show()
    sys.exit(App.exec())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...